Soy nuevo en Python con algo de experiencia en Java.

class test:
    a = "123ss"
    def _init_(self,name):
        self.name = name
    def dosomething(self):
        print self.name
        b = "123"
        self.c = "aaa"

En el ejemplo anterior, a es una variable de clase, self.name es una variable de instancia. Mi pregunta es que b y c son variables de instancia o b y c solo tienen el alcance dentro del método dosomething (por lo tanto, otros métodos no pueden acceder a él)

0
Xuzheng Wang 10 dic. 2015 a las 12:56

4 respuestas

La mejor respuesta

b es una variable local dentro del método dosomething, solo existe allí.

self.c es un atributo del objeto self. Como esa es la instancia, es un atributo de instancia.

self.name también se busca en self, pero como la instancia en sí no tiene ese atributo, se busca en la clase después de probar la instancia.

Finalmente, si asigna a self.name, entonces crea un atributo de instancia ; self.name tendrá el nuevo valor después, pero solo en esa instancia. test.a es el atributo de clase y no se modificará.

3
RemcoGerlich 10 dic. 2015 a las 09:59

Puede probar esto fácilmente, por ejemplo así:

class test:
    a = "123ss"
    def __init__(self,name):
        self.name = name
    def dosomething(self):
        print(self.name)
        b = "123"
        self.c = "aaa"

for attr in ['name', 'a', 'b', 'c']: print hasattr(test, attr),
print

foo = test('bar')
for attr in ['name', 'a', 'b', 'c']: print hasattr(foo, attr),
print

foo.dosomething()
for attr in ['name', 'a', 'b', 'c']: print hasattr(foo, attr),

Salidas:

False True False False
True True False False
bar
True True False True

Tenga en cuenta que c no existe hasta que ejecute dosomething().

1
arekolek 10 dic. 2015 a las 10:19

Primero, la función init es __init__ a _init_, En segundo lugar, c es una variable de instancia, pero solo está disponible después de ejecutar instance.dosomething(). Tercero, b solo estará disponible en el alcance de la función.

2
MariusSiuram 11 dic. 2015 a las 10:15

En Python debe usar self explícitamente para acceder a las variables de instancia. De lo contrario, está accediendo a una variable local.

0
mirosval 10 dic. 2015 a las 10:02
34198692