1

我有一个班级,我希望能够检查其成员并列出它们。但是,我只会将其子类化(在 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))

4

1 回答 1

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}
>>>

或者,您可能还想访问父类字典。从类(或实例)方法中,您可以通过以下方式访问基类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}
于 2013-07-22T17:23:13.693 回答