如何从父母那里获取属性?

时间:2010-12-21 17:30:46

标签: python

假设我们有这些课程:

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()

我从父母和孩子那里得到了所有的属性。我怎样才能从父级获取属性?

提前致谢!

4 个答案:

答案 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