【发布时间】:2018-11-19 23:57:35
【问题描述】:
我试图在我的元类中使用property() 来提供一种访问/设置内部属性的方法。我使用property() 与@property 相对,因为它位于元类中,我需要将该属性应用于__new__ 方法中传递的类。
这是我的代码与相关部分的基本示例:
def __new__(mcls, name, bases, dct, **kwargs):
def getabstract(obj):
return getattr(obj, '_abstract', False)
def setabstract(obj, value):
if str(value) in ('True', 'False'):
return setattr(obj, '_abstract', value)
else: print(f'invalid abstract assignment {value}')
return None
cls = super().__new__(mcls, name, bases, dct)
for name, value in cls.__dict__.items():
if callable(value):
# only applies to callable (method)
value._abstract = getattr(value, '_abstract', False)
# add an _abstract attribute to the method or return its
# current value if it already has one
for base in bases:
base._abstract = getattr(base, '_abstract', False)
# give each base class an _abstract attribute if not already given
cls.abstract = property(getabstract(cls),
setabstract(cls, getattr(cls, '_abstract', False)))
# make an abstract property for class
for name, value in cls.__dict__.items():
if callable(value):
# make an abstract property for functions
value.abstract = property(getabstract(value),
setabstract(value, getattr(value, '_abstract', False)))
当我运行它时,不会发生错误,但是当访问由这个元类创建的新类时,例如Foo.abstract 它返回:
<property object at 0x.....>
此外,用作设置器的setabstract() 函数仅在True 或False 时设置属性,但是当我执行Foo.abstract = 'foo' 之类的操作时,它仍将值设置为'foo'
我在这里做错了什么还是我错过了什么?
【问题讨论】:
-
更新:删除属性的使用并简单地将
_abstract属性重命名为abstract似乎可以完成这项工作,但只是失去了仅允许True/False设置值的功能跨度>
标签: python properties metaclass