[英]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.