繁体   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