![](/img/trans.png)
[英]Python: How to access parent class object through derived class instance?
[英]How to get the name of the instance of the parent class from the derived class in Python?
嗨,我想從繼承的子類中獲取基類的實例名稱。
對於前。
class Foo():
def __init__(self, fakeArg):
self.a = fakeArg
class Bar(Foo):
def __init__(self, fakeArg1):
Foo.__init__(self)
self.b = fakeArg1
# say, i store parent(Foo) instance in an variable too
self.c = f
f = Foo('Hello')
b = Bar('Bar')
現在,我想將“ f”附加(關聯)到“ b”,這樣,如果我將Bar實例化為b,它還應該存儲父類的哪個實例正在調用派生類的實例。
一種實現方法是將父類(Foo)實例“ f”解析為類(Bar)的“ _ init _ ”方法的參數。但是,這有點可笑。
請提供解決問題的方法。
提前致謝。
對您來說,聽起來像是駭客,您應該如何去做。
請記住,每個類可能都有大量實例,因此它無法自動知道哪個類應該與之“相關”-並使用各種魔術(例如檢查父堆棧框架中是否包含Foo
實例的變量)並希望這是唯一的一個),如果我是你的老板,這將是一個非常丑陋的理由,也是一個讓你難對付的理由。
因此,您應該將f
作為參數傳遞給Bar()
。
如果您不想使用單獨的Foo
實例(即,您想要正常繼承),則無需創建Foo
實例,只需調用Foo.__init__(self, 'Hello')
或super(Bar, self).__init__('Hello')
在Bar
構造函數中,並且可能接受該值作為參數,而不是對其進行硬編碼。
聽起來您可能對繼承在Python中的工作方式感到困惑。 在您顯示的代碼中, f
和b
沒有關系,只是彼此相鄰實例化了。
但是,您的Bar
實例b
確實有權訪問Foo
實例,即本身。 通過聲明Bar
是Foo
的子類,您是說Bar
每個實例也是Foo
的實例。 您可以使用isinstance(b, Foo)
。
如果您需要從bar
方法訪問Foo
定義的變量或方法,通常您可以直接在傳遞的self
值上直接訪問它。 或者,如果您要覆蓋Bar
的方法(即,定義一個與Foo
中已經存在的方法同名的方法,則可以使用super
:
class Foo:
def __init__(self, a):
self.a = a
def sayHello(self):
print("Hello!")
class Bar(Foo):
def __init__(self, a, b):
super().__init__(self, a) # calls overridden __init__ method from Foo
self.b = b
def doSomething(self):
self.sayHello() # calls a method defined in Foo
return self.a + self.b # accesses variable "a" that was set in Foo
(請注意,上面的代碼是針對Python 3的。有一些小事情會使它在Python 2中無法正常工作。如果您出於維護除舊Python 2應用程序之外的其他原因學習Python,建議您學習Python 3 。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.