Python 如何从父级获取属性?

Python 如何从父级获取属性?,python,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

假设我们有这些课程:

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将所有对象属性存储在“对象上”的同一位置;它不会将它们划分为单独的存储区域,在继承层次结构中每个类一个存储区域。最好的方法是保留一个属于每个级别的属性列表,可能是在每个类中都有一个
\uuuu slots\uuuu=[]
声明,也可能是保留一个不太正式的属性名称列表,然后使用
getattr()
内部执行循环(或者直接在对象的
\uu dict\uuu>中执行循环)以获取特定的属性集

你想用这个属性列表做什么?你想用它们完成什么?也许有更好的方法来解决您的大问题。

快速示例(可能是,也可能不是您想要的):

Edit:稍微澄清一下:
\uuuuu base\uuuu
是一个类属性,包含该类的基类元组。因为您的子类只有一个基类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.getAttributes()
# setBar
# __module__
# bar
# getAttributes
# __dict__
# __doc__
# __weakref__
# _bar
# __init__
# getBar
“如何仅从父级获取属性?”

真的没有“父母”。Child(Foo)是一个类,因此Foo在这里是“父类”(尽管您通常称之为“超类”),但这种关系不会延续到实例

当您通过
child=child()
实例化类时,
child
没有父对象。它的所有属性都直接位于实例上,因此实际上没有父级。这就是它成为问题的原因。但正如Brandon所建议的那样,通过使用插槽或以其他方式定义哪些属性属于哪个超类,您只能返回在特定类中定义的属性


不过,我无法理解你到底为什么想要这个

您想通过child调用Foo类的getAttributes??为什么不直接调用
Foo.getAttributes()
?这是一个示例。在我的实际程序中,很多类都是从主类扩展而来的。我有一个包含这些类变量的列表,但我只想从父类访问属性。举个例子,我调用getAttributes,我不知道哪个类听起来像你的设计是错误的,它不起作用。我做了dir(child.\uuuuuu class\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuufunction@bribon:base属性未由dir()AFAIK报告-可能我误解了这个问题。您是否意识到您的第二个构造(使用
\uuuu base\uuuu
查找名称
\u bar
)只列出了超类的类属性,并且超类的
\uuu init\uuu
中设置的任何实例属性都不会出现在列表中?例如:您没有打印
,我原以为这是一项要求,因为这是父类实例的属性。@Brandon Craig Rhodes:是的,我有;其主要思想是给出一个关于base属性的提示,它可能适合也可能不适合实际环境中的需要。另外,从我在给定示例中看到的情况来看,这与child.getAttributes()同步,后者也不会返回超类实例属性。“顺便说一句,孩子.”布兰登·克雷格·罗德斯:是的,这是一种可能的方法,而不是最佳的方法,我很高兴您对此发表了评论。我使用dict来呈现我的类中的所有属性,这样我就可以创建包含每个对象内容的XML或JSON,而无需逐个调用每个属性。我有不同的方法,但是你的帮助非常有用,谢谢!
child = Child()
child.getAttributes()
# setBar
# __module__
# bar
# getAttributes
# __dict__
# __doc__
# __weakref__
# _bar
# __init__
# getBar