我想对用
@classmethod
装饰的属性进行一些运行时类型检查(确保类方法装饰一个属性而不是其他东西),但我没有找到通过“正常”方式做到这一点的方法(用 vars()
或 dir()
或 .__dict__
检查):
>>> class A:
... @classmethod
... @property
... def d(cls):
... return 'foo'
...
>>> A.d
<bound method ? of <class '__main__.A'>>
>>> A.__dict__["d"]
<classmethod object at 0x0000022ED4766130>
>>> A.__dict__["d"].__dict__
{}
有什么方法可以检查
classmethod
A.d
是否绑定了 property
?
我知道这可能在幕后窥视得太远,并且也愿意接受有关如何使用类型注释来完成此任务的建议!
这不是
abc
的简单应用,因为这是一个属性,其存在取决于其他属性的存在,我在运行时检查这些属性是否符合数据模型。
您可以检查
__func__
实例的 classmethod
属性以查看它是否绑定到 property
。
class A:
@classmethod
@property
def d(cls):
return 'foo'
A.__dict__['d']
A.__dict__['d'].__func__
isinstance(A.__dict__['d'].__func__, property)
<classmethod(<property object at 0x7fdb467cd670>)>
<property object at 0x7fa6cf6eac50>
True