2013-11-24 3 views
2

Как я понимаю, свойство класса можно использовать в некотором смысле как статическую переменную для Python. У меня есть класс, и я бы хотел установить эту статическую переменную во время первого запуска __init__(), т. Е. Когда создается первый объект и что-то подобное. Не обновлять его каждый раз. Что мне делать в точности? Даже установка флага не помогает.Как инициализировать переменную класса с __init __()?

class A(): 
    foo=None 
    foo_set_flag=False 
    def __init__(self,arg_foo): 
     if not self.foo_set_flag: 
      self.foo=arg_foo 
      foo_set_flag=True 
a=A(12) 
b=A(13) 
print a.foo 
print b.foo 

, который дает:

12 
13 

и, конечно, я ожидаю

12 
12 

ответ

3

Использование ClassName.attribute_name для доступа к атрибуту класса:

class A: 
    foo = None 
    foo_set_flag = False 

    def __init__(self, arg_foo): 
     if not A.foo_set_flag: 
      A.foo = arg_foo 
      A.foo_set_flag = True 

a=A(12) 
b=A(13) 
print a.foo # -> 12 
print b.foo # -> 12 

self.foo = ... создает новый атрибут экземпляра , Чтение self.foo будет получать атрибут класса только в том случае, если атрибут экземпляра foo отсутствует, в противном случае он получает доступ к переменной instnace foo.

+0

Однако это решение не сработает, если имя класса изменяется и требует изменения функции. Я думаю, что мое решение лучше. –

+1

@RamchandraApte, я не думаю, что метод '__ini__' сам по себе является классом mehtod, это не очень хорошая идея. ИМХО, делая метод разделенного класса и вызывая его из '__init__', является более разумным. – falsetru

+0

Почему? Если вам нужно получить доступ к экземпляру, вы можете переместить части, которые должны использовать метод класса, в отдельную функцию. –

0

Вместо self, относятся к самому классу:

def __init__(self,arg_foo): 
    if not A.foo_set_flag: 
     A.foo=arg_foo 
     A.foo_set_flag=True 

Или, вам даже не нужны флаги для достижения этой цели:

>>> class A(): 
    foo = None 
    def __init__(self, arg_foo): 
     if A.foo is not None: 
      A.foo = arg_foo 


>>> a = A(10) 
>>> b = A(20) 
>>> print(a.foo) 
10 
>>> print(b.foo) 
10 
Смежные вопросы