To jest Foo
, który nie jest widoczny, ponieważ jesteś w trakcie jego budowania. Ale skoro jesteś w takim samym zakresie jak custom
, można po prostu powiedzieć custom
zamiast Foo.custom
:
class Foo(object):
custom = 1
def __init__(self, mycustom=custom):
self._custom = mycustom
jednak pamiętać, że zmiana Foo.custom
później nie będzie miało wpływu na wartość custom
które następnie utworzonego Foo
Zobaczmy :
class Foo(object):
custom = 1
def __init__(self, mycustom=custom):
self._custom = mycustom
one = Foo()
Foo.custom = 2
two = Foo()
print (two._custom) # Prints 1
Wykorzystując wartości domyślnej Sentinel zamiast można dostać to, co chcesz:
class Foo(object):
custom = 1
def __init__(self, mycustom=None):
if mycustom is None:
self._custom = Foo.custom
else:
self._custom = mycustom
one = Foo()
Foo.custom = 2
two = Foo()
print (two._custom) # Prints 2
Przyjemnie, z wyjątkiem porównań z Brak należy zawsze robić za pomocą 'jest'. –
"Chociaż oznacza to, że zmiana Foo.custom w późniejszym czasie nie wpłynie na wartość niestandardową, która została później utworzona przez Foos": Warto zauważyć, że zawsze jest tak w przypadku funkcji, dla których wartości domyślne są tworzone i powiązane tylko raz, kiedy funkcja jest tworzona, więc nawet * jeśli * możliwe było odniesienie Foo.custom do wartości domyślnej, nadal byłoby tak, że domyślna wartość nie zmieniłaby się, gdyby zmieniono Foo.custom. – Miles
Dlaczego dopuszczalne jest odwoływanie się do Foo.custom do treści __init__, ale nie do listy inicjalizatora? W obu przypadkach "jesteśmy w trakcie budowania". –