Pasar variables, crear instancias, uno mismo, La mecánica y el uso de clases: necesita explicación [cerrado]


He estado sentado sobre esto todo el día y ya estoy un poco cansado, así que por favor discúlpeme por ser breve.

Soy nuevo en python.

Acabo de reescribir un programa de trabajo, en un montón de funciones en una clase y todo desordenado. No sé si soy yo, pero estoy muy sorprendido de no haber podido encontrar un tutorial para principiantes sobre cómo manejar las clases en la web, así que tengo algunas preguntas.

Primero de todos, en la sección __init__ de la clase he declarado un conjunto de variables con self.variable=something.

¿Es correcto que debería ser capaz de acceder/modificar estas variables en cada función de la clase usando self.variable en esa función? En otras palabras, declarando self.variable He hecho estas variables, variables globales en el ámbito de la derecha de la clase?

Si no, ¿cómo me manejo a mí mismo?

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 una función de la clase fuera del ámbito de la clase? Algún código de ejemplo sería genial.

En cuarto lugar , ¿cómo puedo crear una Instancia de class INITIALCLASS en otro class OTHERCLASS, pasando 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()

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ía cómo crear correctamente una instancia de una clase. En general no entendía la mecánica de las clases, así que por favor ayúdame y explícamelo como si no tuviera idea (lo cual no entiendo, parece). O indíqueme un video completo, o un tutorial legible.

Todo lo que encuentro en la web son ejemplos súper simples, que no me ayudaron mucho. O simplemente definiciones muy cortas de clases y de instancias de métodos de clase, etc.

Puedo enviarles mi código original si quieren, pero es bastante largo.

Author: NoobEditor, 2012-07-11

3 answers

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
 62
Author: mgilson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-29 15:45:16

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

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 tienes 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 quieres abrir una nueva cuenta tienes que crear una instancia de tu clase. Para hacer eso, tienes que 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 M. J. un nuevo anillo que tiene que retirar algo de dinero. Él llamaría al método withdraw por su cuenta:

spidermans_account.withdraw_money(100)

Si quiere ver la balanza, llama:

spidermans_account.show_balance()

Todo lo relacionado con las clases es modelar objetos, sus atributos y mecanismos. Para crear un objeto, crear instancias de ella, como en el ejemplo. Los valores se pasan a las clases con métodos getter y setter como `earn_money(). Esos métodos acceden a las variables objetos. Si quieres que tu clase almacene otro objeto tienes que definir una variable para ese objeto en el constructor.

 25
Author: MaxPowers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-20 23:15:28

El objetivo de una clase es crear 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 más bien que una instancia tiene atributos, y esa instancia puede referirse a sus propios atributos en cualquiera de su código (a través de self.whatever). Del mismo modo, cualquier otro código dado una instancia puede utilizar esa instancia para acceder a los atributos de la instancia-ie instance.whatever.

 2
Author: Daniel Roseman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-10 21:09:59