Скажем, у меня есть класс с «частной» переменной класса и экземпляром класса. Я хочу предотвратить установку переменной вне класса или выполнение определенной функции при изменении переменной класса.
class SomeClass (object):
__classVar = 5
def getClassVar():
return SomeClass.__classVar
instance = SomeClass()
Переменная __classVar недоступна для прямого чтения вне класса (например, я не могу сделать a = SomeClass.__ClassVar или b = instance.__classVar), но тот факт, что переменная является частной, не мешает мне это сделать:
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
неявно вызывает функцию __setattr__, поэтому я могу перегрузить ее в определении класса.
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
__variable
должен быть закрытым. Вы не можете защититься от гнусности на любом языке. - person rlbond   schedule 19.08.2015type(instance).__setattr__
вы вызываетеtype(SomeClass).__setattr__
. - person chepner   schedule 19.08.2015