在Python中从父级访问子级的__dict__?

时间:2013-07-22 17:20:55

标签: python class oop

我有一个课程,我希望能够检查其成员并列出它们。但是,我只是要继承它(在C ++中这将是一个抽象类),所以我希望这个方法也返回其子类中的成员。

这在Python中是可能的,甚至是个好主意吗?如果没有inspect模块,可以采取后续行动吗?

像这样:

class A:
    @staticmethod
    def GetMembers():
        return dict(vars(A))

class B(A):
    FOO = 'foobar'
    BAR = 'barfoo'

然而,测试显示:

>>> A.GetMembers()
{'__module__': '__main__', '__doc__': None, 'GetMembers': <staticmethod object at 0x02219BB0>}
>>> B.GetMembers()
{'__module__': '__main__', '__doc__': None, 'GetMembers': <staticmethod object at 0x02219BB0>}
>>> dict(vars(B))
{'__module__': '__main__', 'FOO': 'foobar', 'BAR': 'barfoo', '__doc__': None}

我希望B.GetMembers()包括FOOBAR dict(vars(B))

1 个答案:

答案 0 :(得分:5)

@staticmethods没有意识到类和类的范围......因此静态方法无法知道它是否在子类上调用。

@classmethods接受他们的类类型作为第一个参数(就像instancemethods将self作为第一个参数一样)...然后你可以在它的cls上调用任何东西。

class A:
    @classmethod
    def GetMembers(cls):
        return dict(vars(cls))

class B(A):
    FOO = 'foobar'
    BAR = 'barfoo'

测试

>>> A.GetMembers()
{'__module__': '__main__', '__doc__': None, 'GetMembers': <classmethod object at
 0x0286D130>}
>>> B.GetMembers()
{'__module__': '__main__', 'FOO': 'foobar', 'BAR': 'barfoo', '__doc__': None}
>>>

或者您也可能想要访问父类dicts。 从类(或实例)方法,您可以通过cls.__bases__

访问基类
class A:
    @classmethod
    def GetMembers(cls):
      d = dict()
      for basecls in cls.__bases__:
        if hasattr(basecls,"GetMembers"):
          d.update(basecls.GetMembers()) #call inherited GetMembers
        else:
          d.update(dict(vars(basecls))) #no GetMembers inherited from basecls so just get its vars
      d.update( dict(vars(cls)))
      return d

>>> class B(A):
...     FOO = 'foobar'
...     BAR = 'barfoo'
...
>>> class C(A):
...     FOOBAR = "whatever"
...
>>> class X(B,A):
...     FOO = 'foobar2'
...     COLOR = 'red'
...
>>> class X(B,C):
...     FOO = 'foobar2'
...     COLOR = 'red'
...
>>> X.GetMembers()
{'__module__': '__main__', 'BAR': 'barfoo', 'COLOR': 'red', 'FOOBAR': 'whatever'
, 'FOO': 'foobar2', '__doc__': None}