我有一个课程,我希望能够检查其成员并列出它们。但是,我只是要继承它(在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()
包括FOO
和BAR
dict(vars(B))
。
答案 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}