簡體   English   中英

如何從Python的派生類中獲取父類實例的名稱?

[英]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中的工作方式感到困惑。 在您顯示的代碼中, fb沒有關系,只是彼此相鄰實例化了。

但是,您的Bar實例b確實有權訪問Foo實例,即本身。 通過聲明BarFoo的子類,您是說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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM