我如何才能发现一个类在其主体中的字段具有多个定义?例如:
class cl:
a = 'abc'
a = 'qa'
print cl.a
在这里,我们将cl.a
打印为'qa'
。但是,在这种情况下,有任何方法可以引发异常,或者发现该字段具有多个定义。
我尝试在类dict中查找,并且还使用了dir()
方法来获取所有属性的列表。它们都没有显示该字段的多个定义。
答案 0 :(得分:3)
元类的__prepare__
方法可以返回替代的映射类型,以用作该类的属性字典。该映射可以允许分配给任何新键,但是如果在名称空间中已经存在的键再次尝试分配时,则会引发异常。
class AssignOnceDict(dict):
def __setitem__(self, key, value):
if key in self:
raise Exception("Duplicate assignment")
super().__setitem__(key, value)
class AssignOnceMeta(type):
def __prepare__(name, bases, **kwargs):
return AssignOnceDict()
class cl(metaclass=AssignOnceMeta):
a = 1
a = 2 # raises an exception
答案 1 :(得分:2)
没有“具有多个定义”这样的东西。 class
块中的代码在创建类时运行,然后结果变量成为该类的属性。就像您在最高层写作一样
a = 'abc'
a = 'qa'
,然后想找出存在多个任务的事实;没有历史可以查阅(除非您在作业完成时自行创建)。