我有一个用例,我使用元类来装饰类的实例方法。
class DecoratedMeta(type):
def __new__(mcs, name, bases, attrs):
cls = super(DecoratedMeta, mcs).__new__(mcs, name, bases, attrs)
for attr_name in dir(cls):
if mcs.is_valid(getattr(cls, attr_name)):
setattr(cls, attr_name, mcs.decorate(getattr(cls, attr_name)))
return cls
方法is_valid
应确定底层属性是cls
(或其基类之一)的实例方法还是静态类cls
(或其中一个基类)。
getattr
将实例方法和静态方法作为函数返回。那么我如何确定它是静态还是实例方法?
我不仅可以依赖cls.__dict__
,因为它不包含基类的属性,我宁愿不手动检查继承树中所有类的__dict__
。
我目前通过检查方法的第一个参数是self
来解决这个问题,但有更好的方法吗?