Да, только доступ к переменной на объект класса:
class myClass(object):
myvariable = 1
def add(self):
myClass.myvariable += 1
def print1(self):
print myClass.myvariable
или если вы хотите, чтобы установить его в подкласс, используйте type(self)
:
class myClass(object):
myvariable = 1
def add(self):
type(self).myvariable += 1
def print1(self):
print type(self).myvariable
разница в том, тх t последний создаст отдельный атрибут для любого подкласса, если он установлен, маскируя атрибут базового класса. Это точно так же, как установка атрибута в экземпляре маскирует атрибут класса.
Хотя вы можете получить атрибут класса через self
, а также (print self.myvariable
), явно лучше, чем неявное здесь, и избегает случайно маскируется атрибутом экземпляра одного и того же имени. Установка атрибутов класса всегда должна выполняться в классе; установка его на self
вместо этого создаст или обновит атрибут экземпляра (не общий).
Унаследовать ваши классы от object
; использование классов нового стиля имеет много преимуществ, ни в коем случае, что type(self)
тогда фактически вернет класс. В классах старого стиля (не наследуя от object
) вместо этого вам придется использовать self.__class__
.
Использование object
в качестве базы также дает вам третий вариант, методы класса с @classmethod
decorator; используйте их, когда вам нужен только доступ к объекту класса, а не к экземпляру. Эти методы связаны с текущим (суб) класса, поэтому их влияние на класс атрибутов является такой же, как с помощью type(self)
:
class myClass(object):
myvariable = 1
@classmethod
def add(cls):
cls.myvariable += 1
@classmethod
def print1(cls):
print cls.myvariable
Вы не забыли 'self' в методах? –
@MauroBaraldi: Я действительно. –
Или, что еще проще, вы можете просто получить доступ к переменной класса через 'self'. – Marcin