簡體   English   中英

如何從父項獲取屬性?

[英]How to get attributes from parent?

假設我們有以下類:

class Foo(object):
    _bar = ""

    def __init__(self):
        self.bar = "hello"

    def getBar(self):
        return self._bar

    def setBar(self, bar):
        self._bar = bar

    def getAttributes(self):
        for attr in self.__dict__:
            print attr

    bar = property(getBar, setBar)

class Child(Foo):

    def __init__(self):
        super(Child, self).__init__()
        self.a = ""
        self.b = ""

如果我這樣做:

child = Child()
child.getAttributes()

我從父母和孩子那里獲得了所有屬性。 如何僅從父級獲取屬性?

提前致謝!

你不能。 Python將所有對象屬性存儲在“對象上”的同一位置; 它不會將它們分成單獨的存儲區域,在繼承層次結構中每個類一個。 最好的辦法是保留一個屬於每個級別的屬性的列表,可能是在每個類中都有一個__slots__ = []聲明,或者可能是保留一個不太正式的屬性名稱列表,然后使用getattr()循環getattr()內部(或直接在對象的__dict__ ?中查找的循環)以獲取特定的屬性集。

您要使用此屬性列表做什么? 您想與他們達成什么? 也許有更好的方法來解決更大的問題。

“我怎么只能從父母那里得到屬性?”

確實沒有“父母”。 Child(Foo)是一個類,因此Foo在這里是“父”(盡管通常將其稱為“超類”),但是這種關系不會延續到實例中。

當您通過child = Child()實例化類時, child沒有父級。 它的所有屬性都直接位於實例上,因此實際上沒有父級。 這就是為什么它會成為問題。 但是正如布蘭登建議的那樣,通過使用插槽或以其他方式定義哪些屬性屬於哪個超類,您只能返回在特定類中定義的那些屬性。

但是,為什么在地球上您會希望這超出了我的范圍。 :)

快速示例(可能不是您想要的):

child.__class__.__bases__[0]().getAttributes()

編輯 :稍微澄清一下: __base__是一個類屬性,包含該類的基類的元組。 由於您的Child類只有一個基類Foo ,因此我只是選擇該元組的第一個元素。 使用您的數據作為輸入,它將產生:

>>> child.getAttributes()
a
_bar
b

>>> child.__class__.__bases__[0]().getAttributes()
_bar

如果將class FoogetAttributes()方法更改為:

def getAttributes(self):
    for attr in self.__class__.__bases__[0].__dict__:
        print attr

然后,通過在Child實例上調用它會得到以下結果:

child = Child()
child.getAttributes()
# setBar
# __module__
# bar
# getAttributes
# __dict__
# __doc__
# __weakref__
# _bar
# __init__
# getBar

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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