有没有办法检查装饰类方法绑定到哪个对象?

问题描述 投票:0回答:1

我想对用

@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
的简单应用,因为这是一个属性,其存在取决于其他属性的存在,我在运行时检查这些属性是否符合数据模型。

python reflection python-decorators
1个回答
0
投票

您可以检查

__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
© www.soinside.com 2019 - 2024. All rights reserved.