在一个类中找出一个字段的多个定义

时间:2019-04-02 06:49:08

标签: python class

我如何才能发现一个类在其主体中的字段具有多个定义?例如:

class cl:
    a = 'abc'
    a = 'qa'

print cl.a

在这里,我们将cl.a打印为'qa'。但是,在这种情况下,有任何方法可以引发异常,或者发现该字段具有多个定义。 我尝试在类dict中查找,并且还使用了dir()方法来获取所有属性的列表。它们都没有显示该字段的多个定义。

2 个答案:

答案 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'

,然后想找出存在多个任务的事实;没有历史可以查阅(除非您在作业完成时自行创建)。