这是一个简单的例子:
class KEY(object):
A = 'a'
A = 'b'
B = 'b'
有没有办法测试“A”是否在“KEY”类中重复定义,而不管分配的值如何?
这是一个简单的例子:
class KEY(object):
A = 'a'
A = 'b'
B = 'b'
有没有办法测试“A”是否在“KEY”类中重复定义,而不管分配的值如何?
如果您使用的是 Python 3,则可以使用dict
仅允许设置不存在的键的子类和__prepare__
元类的方法来干净地执行此操作。更多信息在这里。在 Python 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
模式。
总的来说,我不会推荐这种解决方案,但这是我现在能想到的最好的解决方案。