Jak rozumiem, właściwość klasy może być używana w pewnym sensie jako zmienna statyczna dla Pythona. Mam klasę i chciałbym ustawić tę statyczną zmienną podczas pierwszego biegu __init__(), tj. Po utworzeniu pierwszego obiektu i tak, aby go tak zachować. Nie aktualizować go za każdym razem. Co mam dokładnie zrobić? Nawet ustalenie flagi nie pomaga.

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

Co daje:

12
13

I oczywiście oczekuję

12
12
3
Cupitor 24 listopad 2013, 18:58

2 odpowiedzi

Najlepsza odpowiedź

Użyj ClassName.attribute_name, aby uzyskać dostęp do atrybutu klasy:

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 = ... tworzy nową atrybut instancji. Czytanie self.foo Uzyskanie atrybutu klasy tylko wtedy, gdy nie ma atrybutu instancji foo, w przeciwnym razie dostęp do zmiennej instnace foo.

6
falsetru 24 listopad 2013, 15:15

Zamiast self, odnoszą się do samej klasy:

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

Lub nawet nie potrzebujesz flag, aby to osiągnąć:

>>> 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
0
aIKid 24 listopad 2013, 15:11