在Python中,通过类名设置类变量时隐式调用哪个函数?
假设我有一个带有“private”类变量的类和该类的一个实例。我想防止从类外部设置变量,或者在更改类变量时执行特定函数在Python中,通过类名设置类变量时隐式调用哪个函数?,python,python-3.4,setter,static-variables,class-variables,Python,Python 3.4,Setter,Static Variables,Class Variables,假设我有一个带有“private”类变量的类和该类的一个实例。我想防止从类外部设置变量,或者在更改类变量时执行特定函数 class SomeClass (object): __classVar = 5 def getClassVar(): return SomeClass.__classVar instance = SomeClass() _u_classVar变量不能从类外部直接读取(例如,我不能 a=SomeClass.\uuuuClassVar或b=in
class SomeClass (object):
__classVar = 5
def getClassVar():
return SomeClass.__classVar
instance = SomeClass()
_u_classVar变量不能从类外部直接读取(例如,我不能
a=SomeClass.\uuuuClassVar或b=instance.\uuuuClassVar)
但变量是私有的这一事实并不能阻止我这样做:
SomeClass.__classVar = 6
instance.__classVar = 10
即使这实际上并没有给变量赋值。例如,下面的代码仍将输出5
class SomeClass (object):
__classVar = 5
def getClassVar():
return SomeClass.__classVar
instance = SomeClass()
SomeClass.__classVar = 6
instance.__classVar = 10
print (getClassVar()) #outputs 5
我知道这句话
instance.__classVar = 10
隐式调用\uuuu setattr\uuuu函数,因此我可以在类定义中重载它
class SomeClass (object):
__classVar = 5
def getClassVar():
return SomeClass.__classVar
def __setattr__(cls, name, value):
print ("Setting a class variable via instance name")
#do something specific
但是,我不知道如何控制通过类名设置属性时发生的情况
SomeClass.__var = 6 ##want to do something specific when this happens
我建议您遵循,但是,如果您非常需要该功能,您可能会对Python元类感兴趣
您可以做的是创建自己的自定义类继承自类型
类,并在其中重载\uuuu setattr\uuuu
:
class YourMeta(type):
def __setattr__(self, name, value):
# do your stuff here
然后简单地将它作为另一个类的元类liek:
class SomeClass(object):
__metaclass__ = YourMeta
# And so on
因此,现在,在类级别将有一个重载的
\uuuu setattr\uuuu
。简短回答:不要这样做。如果人们想做一些愚蠢的事情,没有办法阻止他们,奇怪的变通方法只会让你的代码难以使用。同意尼克·约翰逊的观点。这一点毫无意义,任何半途而废的Python程序员都知道\uu变量
应该是私有的。在任何语言中,你都无法抵御邪恶。同样的技术,只是没有调用type(instance)。\uuuu setattr\uuuu
,而是调用type(SomeClass)。\uuu setattr\uuu
。我原本以为这是一种方法,但对我来说不起作用。我希望元类attribute更改SomeClass的类型,但它没有print(type(SomeClass))#prints
YourMeta的重载setattr函数在我通过类名设置SomeClass的变量时不会执行。我可能做错了什么?