假设我们有这些课程:
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()
我从父母和孩子那里得到了所有的属性。我怎样才能从父级获取属性?
提前致谢!
答案 0 :(得分:4)
你做不到。 Python将所有对象属性存储在“对象”的相同位置;它不会将它们分成单独的存储区域,继承层次结构中每个类一个。您可以做的最好的事情是保留属于每个级别的属性列表,可能是通过在每个类中使用__slots__ = []
声明,或者通过保留不太正式的属性名称列表,然后执行循环内部getattr()
(或直接在对象__dict__
中查找的循环?)来获取该特定属性集。
您要对此属性列表执行什么操作?你想用他们完成什么?也许有更好的方法来解决你的大问题。
答案 1 :(得分:2)
“我怎么才能从父母那里得到属性?”
真的没有“父母”。 Child(Foo)是一个类,所以Foo是这里的“父”(尽管你通常把它称为“超类”),但这种关系不会延续到实例。
按child = Child()
实例化类时,child
没有父级。它的所有属性都直接位于实例上,所以没有父级,真的。这就是它成为问题的原因。但正如Brandon建议的那样,通过使用插槽或以其他方式定义哪些属性属于哪个超类,您只能返回特定类中定义的属性。
为什么到底你会想要这个超出我的范围。 :)
答案 2 :(得分:1)
快速示例(可能或不是您想要的):
child.__class__.__bases__[0]().getAttributes()
编辑:稍微澄清一点:__base__
是一个包含此类基类元组的类属性。由于你的 Child 类只有一个基类 Foo ,我只是选择了这个元组的第一个元素。使用您的数据作为输入,它将产生:
>>> child.getAttributes()
a
_bar
b
>>> child.__class__.__bases__[0]().getAttributes()
_bar
答案 3 :(得分:0)
如果您将getAttributes()
中的class Foo
方法更改为:
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