有没有一种方法可以通过覆盖来阻止或改变对 Python 中类变量的访问__setattr__
例如变量?
注意这个问题 https://stackoverflow.com/questions/11964895/in-python-count-the-number-of-variables-in-a-class-or-prevent-adding-new-class标题错误,实际上指的是实例变量,而不是类变量。
基于阅读多篇关于(明显的)死亡陷阱的帖子__slots__
,我不想走那条路(而且我还没有对其进行足够的研究,不知道它是否符合我的要求)。
Example:
class A(object):
foo = "don't change me"
def __setattr__(self, name, value):
raise ValueError
if __name__ == '__main__':
a1 = A()
print a1.foo # don't change me
print A.foo # don't change me
A.foo = 'bar' # ideally throw an exception or something here
print A.foo # bar
a2 = A()
print a1.foo # bar
print a2.foo # bar
是的!你用完全相同的方式来做。
A __setattr__
类上的方法控制在该类的实例上设置属性。在Python中,一切都是对象。对象有类。所以你只需要安排你的类成为某个类的实例,该类具有__setattr__
方法,就像您想要防止实例的属性被修改时所做的一样!
类的类称为元类。默认元类是type
:“类型的类型”,或“类的类”。你想要创建一个子类type
不允许设置其实例属性(正如您创建其子类一样)object
当您在实例级别执行此操作时,不允许设置其实例属性)。
class CantTouchThis(type):
def __setattr__(cls, attr, value):
raise Exception("NO!")
class SomeClass(object):
__metaclass__ = CantTouchThis
仔细注意两者之间的区别基类 of SomeClass
,以及class of SomeClass
. SomeClass
是一个子类object
。它是一个实例CantTouchThis
.
几乎所有在实例级别工作的其他内容都可以类似地应用于具有元类的类级别;类只是像其他所有东西一样的实例。他们之所以有独特的优雅行为,是因为他们的方法和实施type
(正如……等等)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)