当使用“new”自定义创建元类时,我们可以将属性传递给type()。“new”方法,该方法将在返回对象之前设置在对象上,例如。
class Foo(type):
def __new__(cls, name, bases, attrs):
attrs['customAttr'] = 'someVal'
return type.__new__(cls, name, bases, attrs)
以便:
>> Foo.__dict__
{'customeAttr': 'someVal', ...}
但是,我不知道如何对普通(非元)类执行相同的操作,这会导致在使用setattr时出现问题:
class Bar(object):
def __new__(cls, someVal):
obj = object().__new__(cls) # cant pass custom attrs
obj.customAttr = someVal # obj is already a Bar and invokes __setattr__
return obj
def __setattr__(*args): raise Exception('read-only class')
所以不幸的是:
>>> Bar(42)
...
Exception: read-only class
在bar的“new”中,我从object()中得到一个成熟的类实例,任何属性访问都要经过正常的查找规则,在本例中调用“setattr”。元类foo避免了这一点,因为type()将在低级创建期间返回实例之前设置属性,而object()则不会。
是否有将属性传递给object()的方法,或者我可以使用另一种类型作为从“new”返回的实例,它允许在成为完整类实例之前设置属性?我对解决方案不感兴趣,比如在创建实例后设置类。