这是一个简单的例子:
class KEY(object):
A = 'a'
A = 'b'
B = 'b'
有没有办法测试'A'是否已在'KEY'类中重复定义,而不管指定的值是什么?
答案 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实现它,有一些限制。