测试是否重复定义类变量

时间:2012-12-14 17:16:37

标签: python

这是一个简单的例子:

class KEY(object):
    A = 'a'
    A = 'b'
    B = 'b'

有没有办法测试'A'是否已在'KEY'类中重复定义,而不管指定的值是什么?

2 个答案:

答案 0 :(得分:2)

这是尝试回答:

类变量不起作用

您无法控制这些重新定义。基本上,metaclass是创建您的课程的所谓,它传递的dict attribute => value。我们可以说它“已经太晚了”。

使用实例变量

您可以控制在课程实例化后执行a.b = c时会发生什么,所以您可以做的是:

class RedefinitionMixin(object):
    def __setattr__(self, k, v):
        if hasattr(self, k):
            raise Exception('Attribute redefinition!')
        super(RedefinitionMixin, self).__setattr__(k, v)

class KEY(RedefinitionMixin, object):
    def __init__(self):
        self.A = 'a'
        self.A = 'b'
        self.B = 'b'

如果你已经覆盖了__setattr__,这可能会导致一些意想不到的行为!

请注意,如果您实际实例化该类,则将起作用 为了避免使用实例的问题,您可以实现singleton模式。


总的来说,我不会推荐这个解决方案,但这是我现在能想到的最好的解决方案。

答案 1 :(得分:2)

如果您正在使用Python 3,则可以使用仅允许设置不存在的键的dict子类和元类的__prepare__方法来干净地执行此操作。 More info here。在Python 2中,它更难; I wrote a horrible hack实现它,有一些限制。