Przekazywanie zmiennych, tworzenie instancji, jaźń, mechanika i użycie klas: potrzeba wyjaśnienia [zamknięte]

Siedzę nad tym cały dzień i jestem już trochę zmęczony, więc proszę wybaczyć, że jestem krótki.

Jestem nowy w Pythonie.

Właśnie przepisałem działający program, na kilka funkcji w klasie i wszystko popaprane. Nie wiem, czy to ja, ale jestem bardzo zaskoczony, że nie mogłem znaleźć samouczka dla początkujących, jak obsługiwać klasy w Internecie, więc mam kilka pytań.

Pierwsza ze wszystkich, w sekcji __init__ klasy i zadeklarowałem kilka zmiennych z self.variable=something.

Czy to prawda, że powinienem być w stanie uzyskać dostęp/modyfikować te zmienne w każdej funkcji klasy używając self.variable w tej funkcji? Innymi słowy, deklarując self.variable stworzyłem te zmienne, globalne zmienne w zakresie klasy, prawda?

Jeśli nie, jak mam sobie poradzić?

Po Drugie , jak poprawnie przekazać argumenty klasie? Jakiś przykładowy kod byłby fajny.

Po Trzecie , Jak nazwać funkcja klasy poza zakresem klasy? Jakiś przykładowy kod byłby fajny.

Po czwarte , Jak utworzyć instancję class INITIALCLASS w innym class OTHERCLASS, przekazując zmienne z OTHERCLASS do INITIALCLASS? Jakiś przykładowy kod byłby fajny.

Chcę wywołać funkcję z {[7] } z argumentami z INITIALCLASS. Do tej pory zrobiłem to.

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()

Najwyraźniej nie rozumiałem, jak przekazywać zmienne do klas lub jak obsługiwać self, kiedy z nich korzystać, a kiedy nie. Prawdopodobnie nie rozumiałem również, jak poprawnie utworzyć instancję klasy. Ogólnie nie rozumiałem mechaniki zajęć, więc proszę o pomoc i wytłumaczenie mi tego, jakbym nie miał pojęcia (czego chyba nie mam). Albo wskaż mi dokładny film lub czytelny samouczek.

Wszystko, co znajduję w sieci, to super proste przykłady, które mi nie pomogły. Lub po prostu bardzo krótkie definicje klas I instancji metod klasowych itp.

Mogę wysłać ci mój oryginalny kod, jeśli chcecie, ale jest dość długi.

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/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-29 15:45:16

Oto prosty przykład użycia klas: Załóżmy, że jesteś Instytutem finansowym. Chcesz, aby konta Twoich klientów były zarządzane przez komputer. Więc musisz modelować te konta. To jest miejsce, w którym pojawiają się zajęcia. Praca z klasami nazywa się programowaniem zorientowanym obiektowo. Dzięki klasom modelujesz obiekty świata rzeczywistego w swoim komputerze. Czego potrzebujemy, aby założyć proste konto bankowe? Potrzebujemy zmiennej, która zapisuje saldo i taką, która zapisuje nazwę klienta. Dodatkowo niektóre metody w-i zmniejszyć równowagę. To może wyglądać tak:

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

Teraz masz abstrakcyjny model prostego konta i jego mechanizm. def __init__(self, name, money) jest konstruktorem klas. Buduje obiekt w pamięci. Jeśli chcesz teraz otworzyć nowe konto, musisz utworzyć instancję swojej klasy. Aby to zrobić, musisz wywołać konstruktor i przekazać potrzebne parametry. W Pythonie konstruktor jest wywoływany przez nazwę klas:

spidermans_account = bankaccount("SpiderMan", 1000)
Jeśli Spiderman chce kupić M. J. nowy pierścień musi wypłacić trochę pieniędzy. Wywołałby metodę withdraw na swoim koncie:
spidermans_account.withdraw_money(100)

Jeśli chce zobaczyć saldo dzwoni:

spidermans_account.show_balance()

Cała rzecz o klasach polega na modelowaniu obiektów, ich atrybutów i mechanizmów. Aby utworzyć obiekt, utwórz go jak w przykładzie. Wartości są przekazywane do klas za pomocą metod getter i setter, takich jak ' earn_money (). Metody te mają dostęp do zmiennych obiektów. Jeśli chcesz, aby Twoja klasa przechowywała inny obiekt, musisz zdefiniować zmienna dla tego obiektu w konstruktorze.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-20 23:15:28

Cały punkt klasy polega na tym, że tworzy się instancję , a ta instancja zawiera zestaw danych. Więc źle jest mówić, że Twoje zmienne są globalne w ramach klasy: powiedzmy raczej, że instancja posiada atrybuty, a instancja może odnosić się do własnych atrybutów w dowolnym kodzie (poprzez self.whatever). Podobnie, każdy inny kod podany instancji może użyć tej instancji, aby uzyskać dostęp do jej atrybutów-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/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-10 21:09:59