Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中,通过类名设置类变量时隐式调用哪个函数?_Python_Python 3.4_Setter_Static Variables_Class Variables - Fatal编程技术网

在Python中,通过类名设置类变量时隐式调用哪个函数?

在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

假设我有一个带有“private”类变量的类和该类的一个实例。我想防止从类外部设置变量,或者在更改类变量时执行特定函数

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的变量时不会执行。我可能做错了什么?