2012-07-10 26 views
22

He estado sentado todo el día y estoy un poco cansado, así que discúlpeme por ser breve.Pasando variables, creando instancias, self, La mecánica y el uso de clases: necesita explicación

Im nuevo en python.

Acabo de volver a escribir un programa de trabajo, en un conjunto de funciones en una clase y todo en mal estado. No sé si soy yo, pero estoy muy sorprendido de que no haya podido encontrar un tutorial para principiantes sobre cómo manejar las clases en la web, así que tengo algunas preguntas.

Primera lugar, en la sección __init__ de la clase que han declarado un montón de variables con self.variable=something.

¿Es correcto que pueda acceder/modificar estas variables en cada función de la clase usando self.variable en esa función? En otras palabras, al declarar self.variable, he hecho estas variables, variables globales en el alcance de la clase ¿verdad?

Si no, ¿cómo me las arreglo?

En segundo lugar, ¿cómo paso correctamente los argumentos a la clase? Algún código de ejemplo sería genial.

En tercer lugar, ¿cómo puedo llamar a una función de la clase fuera del alcance de la clase? Algún código de ejemplo sería genial.

Fouthly, ¿Cómo se crea una instancia de la class INITIALCLASS en otro class OTHERCLASS, pasar variables de OTHERCLASS a INITIALCLASS? Algún código de ejemplo sería genial.

Quiero llamar a una función desde OTHERCLASS con argumentos desde INITIALCLASS. Lo que he hecho hasta ahora es

class OTHERCLASS(): 
    def __init__(self,variable1,variable2,variable3): 
     self.variable1=variable1 
     self.variable2=variable2 
     self.variable3=variable3 
    def someotherfunction(self): 
     something=somecode(using self.variable3) 
     self.variable2.append(something) 
     print self.variable2 
    def somemorefunctions(self): 
     self.variable2.append(variable1) 

class INITIALCLASS(): 
    def __init__(self): 
     self.variable1=value1 
     self.variable2=[] 
     self.variable3='' 
     self.DoIt=OTHERCLASS(variable1,variable2,variable3) 

    def somefunction(self): 
     variable3=Somecode 
     #tried this 
     self.DoIt.someotherfunctions() 
     #and this 
     DoIt.someotherfunctions() 

que claramente no entendía cómo pasar variables a clases o cómo manejar self, cuándo usarlo y cuándo no. Probablemente tampoco entendí cómo crear correctamente una instancia de una clase. En general, no entendí la mecánica de las clases, así que por favor ayúdenme y explíquenme como si no tuviera idea (lo que no creo). O apúntame a un video completo o un tutorial legible.

Todo lo que encuentro en la web son ejemplos super simples, eso no me ayudó mucho. O solo definiciones muy cortas de clases y ejemplos de métodos de clase, etc.

Puedo enviarte mi código original si quieres, pero es bastante largo.

+6

Lea el tutorial de Python [sección de clases] (http://docs.python.org/tutorial/classes.html). – BrenBarn

+1

Conozca las opciones de formato aquí, especialmente para el código. – Marcin

+2

No me refiero a ser condescendiente, pero la meta-respuesta aquí es que necesita reducir la velocidad un poco y averiguar exactamente dónde su código se está desviando de sus expectativas. Intenta hacer pequeños cambios desde tu código de trabajo y prueba cada cambio hasta que se rompa algo. Refactorizando, lo llaman. Además, no te rindas, es solo código, nunca tiene sentido hasta que lo haga. – Ben

Respuesta

46
class Foo   (object): 
    # ^class name #^ inherits from object 

    bar = "Bar" #Class attribute. 

    def __init__(self): 
     #  #^ The first variable is the class instance in methods. 
     #  # This is called "self" by convention, but could be any name you want. 
     #^ double underscore (dunder) methods are usually special. This one 
     # gets called immediately after a new instance is created. 

     self.variable = "Foo" #instance attribute. 
     print self.variable, self.bar #<---self.bar references class attribute 
     self.bar = " Bar is now Baz" #<---self.bar is now an instance attribute 
     print self.variable, self.bar 

    def method(self, arg1, arg2): 
     #This method has arguments. You would call it like this: instance.method(1, 2) 
     print "in method (args):", arg1, arg2 
     print "in method (attributes):", self.variable, self.bar 


a = Foo() # this calls __init__ (indirectly), output: 
       # Foo bar 
       # Foo Bar is now Baz 
print a.variable # Foo 
a.variable = "bar" 
a.method(1, 2) # output: 
       # in method (args): 1 2 
       # in method (attributes): bar Bar is now Baz 
Foo.method(a, 1, 2) #<--- Same as a.method(1, 2). This makes it a little more explicit what the argument "self" actually is. 

class Bar(object): 
    def __init__(self, arg): 
     self.arg = arg 
     self.Foo = Foo() 

b = Bar(a) 
b.arg.variable = "something" 
print a.variable # something 
print b.Foo.variable # Foo 
+0

Hey mgilson, Gracias por la respuesta y el esfuerzo que pones en tu publicación. ¿Cuál es exactamente la diferencia entre la barra de atributos de clase y el atributo de instancia self.bar? excepto que self.bar se llama imidiatly porque está en el método __init__?Quiero decir, ¿qué puedo hacer con self.bar que no puedo hacer con el bar? Además, ¿por qué le pasas esos argumentos directamente a un método? ¿No podrías pasarlos a Foo() cuando se crea la instancia y usarlos a través de Foo()? Y si es así, ¿cómo? ¿Cómo irías si la instancia se crea en otra clase, donde Foo() no está definido? o siempre está definido. – Baf

+0

Si una instancia no tiene un atributo de instancia particular, vuelve al atributo de clase y lo usa. Entonces, esta es una manera para que cada instancia de una clase comparta un dato. ¿Tiene sentido? (Agregué algunos comentarios en '__init__'). ¿Eso ayuda? En cuanto a sus otras preguntas, los argumentos pasados ​​a 'Foo()' se reenvían a '__init__'. Si ayuda, los métodos de instancia son como funciones, excepto que su primer argumento es la instancia utilizada para llamar a ese método. – mgilson

+0

Cuando intenté crear una instancia de myclass en otherclass, el Nombre no cambió de color, ¿no debería colificarse cada nombre de clase? digamos que tengo una variable que está definida en myclass a través de self.variable en __init__, ¿cómo puedo utilizarlo en todos los métodos de clase? ¿Puedo crear una instancia de otherclass en myclass pasando las variables a otherclass donde se atribuyen a self.othervariable y se puede usar en otherclass y sus métodos no tienen que pasarlos a un método de instancia en mi clase? – Baf

2

El punto entero de una clase es que se crea una instancia , y esa instancia encapsula un conjunto de datos. Por lo tanto, es incorrecto decir que sus variables son globales dentro del alcance de la clase: digamos que una instancia contiene atributos, y esa instancia puede referirse a sus propios atributos en cualquiera de sus códigos (a través de self.whatever). De forma similar, cualquier otro código dado a una instancia puede usar esa instancia para acceder a los atributos de la instancia, es decir, instance.whatever.

22

Así que aquí hay un ejemplo simple de cómo usar las clases: Supongamos que es un instituto de finanzas. Desea que las cuentas de sus clientes sean administradas por una computadora. Entonces necesitas modelar esas cuentas. Aquí es donde entran las clases. Trabajar con clases se llama programación orientada a objetos. Con las clases modelas objetos del mundo real en tu computadora. Entonces, ¿qué necesitamos para modelar una simple cuenta bancaria? Necesitamos una variable que guarda el saldo y otra que guarda el nombre de los clientes. Además, algunos métodos para ingresar y disminuir el saldo. Eso podría verse así:

class bankaccount(): 
    def __init__(self, name, money): 
     self.name = name 
     self.money = money 

    def earn_money(self, amount): 
     self.money += amount 

    def withdraw_money(self, amount): 
     self.money -= amount 

    def show_balance(self): 
     print self.money 

Ahora tiene un modelo abstracto de una cuenta simple y su mecanismo. El def __init__(self, name, money) es el constructor de las clases. Construye el objeto en la memoria. Si ahora quiere abrir una nueva cuenta, debe crear una instancia de su clase. Para hacer eso, debes llamar al constructor y pasar los parámetros necesarios. En Python un constructor es llamado por el nombre de las clases:

spidermans_account = bankaccount("SpiderMan", 1000) 

Si Spiderman quiere comprar un nuevo anillo M. J. tiene que retirar algo de dinero. El llamaría el método withdraw en su cuenta:

spidermans_account.withdraw_money(100) 

Si quiere ver el equilibrio que él llama:

spidermans_account.show_balance() 

La cosa entera sobre las clases es modelar objetos, sus atributos y mecanismos. Para crear un objeto, crea una instancia como en el ejemplo. Los valores se pasan a las clases con métodos getter y setter como `earn_money() '. Esos métodos tienen acceso a las variables de tus objetos. Si desea que su clase almacene otro objeto, debe definir una variable para ese objeto en el constructor.

+0

Thx Man muy ilustrativo! de nuevo, me gustaría aceptar esto también como una respuesta, porque me dio algunas buenas ideas, pero la respuesta de mgilson es más fácil de transportar a mi código de conducta. Desearía que toda la documentación de Python estuviera escrita como ustedes chicos, aquí, ID pasó menos tiempo en stackoverflow: P! Por favor, no me linchéis ahora, pero realmente creo que la documentación de Python es bastante pobre en términos de comprensibilidad. Gracias de nuevo MAxPowers esto ayudó bastante! – Baf

+0

@Baf - al igual que cualquier otra cosa, dale algo de tiempo. Una vez que comienzas a aprender la terminología de las cosas, la documentación de Python es realmente muy buena. En otras palabras, concédete un poco de tiempo para avanzar en la curva de aprendizaje y llegarás a amar a los doctores como el resto de nosotros. – mgilson

+0

Y +1 para un ejemplo interesante. – mgilson

Cuestiones relacionadas