Es Foo
que no está visible, porque está en el medio de construirlo. Pero ya que estás en el mismo alcance que custom
, sólo se puede decir custom
en lugar de Foo.custom
:
class Foo(object):
custom = 1
def __init__(self, mycustom=custom):
self._custom = mycustom
Pero tenga en cuenta que el cambio de Foo.custom
más adelante no afectará el valor de custom
que posteriormente crearon Foo
-s ver :
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
mediante el uso de un valor por defecto en lugar centinela, se puede obtener lo que desea:
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
Bueno, excepto que las comparaciones con None siempre deben hacerse a través de 'is'. –
"Aunque eso significa que cambiar Foo.customer más tarde no afectará el valor de la costumbre que los Foos creados posteriormente ven": Vale la pena señalar que siempre es el caso para las funciones que los valores predeterminados se crean y se vinculan solo una vez, cuando la función se crea, por lo que incluso * si * era posible hacer referencia a Foo.custom para un valor predeterminado, todavía sería el caso de que el valor predeterminado no cambiara si se cambiara Foo.custom. – Miles
¿Por qué está permitido hacer referencia a Foo.custom en el cuerpo de __init__ pero no en la lista de inicializadores? En ambos casos, "estamos en el medio de construirlo". –