我想Something
通过使用代码反射找出下面所有类的类方法。对于所有类方法,我的意思是所有用修饰的方法@classmethod
。我实际上不知道是否相同。
class Something:
@classmethod
def a(cls):
print('a')
@staticmethod
def b(cls):
print('b')
def c(self):
print('c')
因此,在这种情况下,我希望得到一个仅包含以下内容的列表'a'
:
get_classmethod_names(Something) == ['a']
这可以简单地遍历class属性并检查classmethod
对象:
In [1]: class Something:
...: @classmethod
...: def a(cls):
...: print('a')
...:
...: @staticmethod
...: def b(cls):
...: print('b')
...:
...: def c(self):
...: print('c')
...:
In [2]: [attr for attr, obj in vars(Something).items() if isinstance(obj, classmethod)]
Out[2]: ['a']
注意,如果您关心继承的类方法,则必须按类的方法解析顺序检查每个类,因此:
In [3]: class BaseSomething:
...: @classmethod
...: def u(cls):
...: print('u')
...:
...: class Something(BaseSomething):
...: @classmethod
...: def a(cls):
...: print('a')
...:
...: @staticmethod
...: def b(cls):
...: print('b')
...:
...: def c(self):
...: print('c')
...:
In [4]: Something.mro()
Out[4]: [__main__.Something, __main__.BaseSomething, object]
In [5]: [
...: attr
...: for cls in Something.mro()
...: for attr, obj in vars(cls).items()
...: if isinstance(obj, classmethod)
...: ]
Out[5]: ['a', 'u']
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句