1

这是一个简单的例子:

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

有没有办法测试“A”是否在“KEY”类中重复定义,而不管分配的值如何?

4

2 回答 2

2

如果您使用的是 Python 3,则可以使用dict仅允许设置不存在的键的子类和__prepare__元类的方法来干净地执行此操作。更多信息在这里。在 Python 2 中更难。我写了一个可怕的黑客来实现它,但有一些限制。

于 2012-12-14T18:11:01.427 回答
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模式。


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

于 2012-12-14T17:38:46.570 回答