[英]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 Foo
的getAttributes()
方法更改為:
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.