关于python:测试是否重复定义类变量

Testing whether class variable is repeatedly defined

下面是一个简单的例子:

1
2
3
4
class KEY(object):
    A = 'a'
    A = 'b'
    B = 'b'

有没有一种方法可以测试"a"是否已在类"key"中重复定义,而不管赋值如何?


如果您使用的是python 3,那么可以使用一个只允许设置不存在的键和元类的__prepare__方法的dict子类来完成这项工作。更多信息。在Python2中,这很难实现;我编写了一个可怕的黑客程序来实现它,但有一些限制。


下面是一个尝试的答案:

类变量不起作用

你不能控制这些的重新定义。基本上,metaclass是创建类的调用,它通过了attribute=>valuedict。我们可以说"已经太迟了"。

使用实例变量

您可以控制在类实例化后执行a.b = c时发生的情况,因此您可以执行以下操作:

1
2
3
4
5
6
7
8
9
10
11
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模式。

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