2014-10-29 2 views
1

Я хочу иметь переменную класса, так что значение может иметь доступ во всех экземплярах, но я также хочу получить доступ к переменной в методах внутри класса. Это возможно? Я пробовал это, но это не сработало.Доступ к переменной класса во всех классах

class myClass: 
    myvariable = 1 

    def add(): 
     myvariable+= 1 

    def print1(): 
     print myvariable 

Я хочу сделать два экземпляра, один только не добавить метод, другой только сделать print1 метод

ответ

6

Да, только доступ к переменной на объект класса:

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 
+0

Вы не забыли 'self' в методах? –

+0

@MauroBaraldi: Я действительно. –

+0

Или, что еще проще, вы можете просто получить доступ к переменной класса через 'self'. – Marcin

Смежные вопросы