2012-07-10 26 views
22

Siedziałem nad tym przez cały dzień i jestem trochę zmęczony, więc przepraszam, żebym był krótki.Przekazywanie zmiennych, tworzenie instancji, self, Mechanika i wykorzystanie klas: potrzebuję wyjaśnienia

Jestem nowy dla Pythona.

Po prostu przepisałem program roboczy, na szereg funkcji w klasie i wszystko poszło na marne. Nie wiem, czy to ja, ale jestem bardzo zaskoczony, że nie mogę znaleźć tutoriala dla początkujących na temat obsługi zajęć w sieci, więc mam kilka pytań.

Pierwszy wszystkim w sekcji __init__ klasy I zadeklarowały kilka zmiennych z self.variable=something.

Czy to prawda, że ​​powinienem mieć możliwość dostępu/modyfikacji tych zmiennych w każdej funkcji klasy za pomocą self.variable w tej funkcji? Innymi słowy, deklarując self.variable dokonałem tych zmiennych, zmienne globalne w zakresie klasy, prawda?

Jeśli nie, w jaki sposób radzę sobie?

Po drugie,, w jaki sposób poprawnie przekazać argumenty do klasy? Przykładowy kod byłby fajny.

Po trzecie,, w jaki sposób wywołać funkcję klasy spoza zakresu klasy? Przykładowy kod byłby fajny.

Fouthly, w jaki sposób mogę utworzyć instancję class INITIALCLASS w innym class OTHERCLASS, przechodząc zmienne z OTHERCLASS do INITIALCLASS? Przykładowy kod byłby fajny.

Chcę wywołać funkcję z OTHERCLASS z argumentami od INITIALCLASS. To, co zrobiłem do tej pory, 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() 

I wyraźnie nie rozumiał, jak przekazać zmienne do klas lub jak radzić self, kiedy go używać i kiedy nie. Prawdopodobnie również nie rozumiem, jak poprawnie utworzyć instancję klasy. Generalnie nie rozumiem mechaniki zajęć, więc proszę pomóżcie mi i wyjaśnijcie mi to tak, jakbym nie miał pojęcia (czego nie wydaje mi się). Lub wskaż mi dokładny film lub czytelny samouczek.

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

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

+6

Przeczytaj samouczek w języku Python [rozdział o klasach] (http://docs.python.org/tutorial/classes.html). – BrenBarn

+1

Informacje na temat opcji formatowania znajdują się tutaj, szczególnie w przypadku kodu. – Marcin

+2

Nie chcę być protekcjonalny, ale meta-odpowiedź polega na tym, że musisz trochę zwolnić i dowiedzieć się, gdzie twój kod odbiega od twoich oczekiwań. Staraj się wprowadzać drobne zmiany z działającego kodu i testuj każdą zmianę, aż coś się zepsuje. Refaktoryzują, nazywają to. Nie bój się, to tylko kod - nigdy nie ma sensu, dopóki to nie zrobi. – Ben

Odpowiedz

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

Hej, mgilson, Thx za odpowiedź i wysiłek włożony w Twój post. Czym dokładnie jest różnica między paskiem atrybutu class a atrybutem self.bar? z tym wyjątkiem, że self.bar jest wywoływany imidiatly, ponieważ jest to metoda __init__?Mam na myśli to, co mogę zrobić z self.bar, którego nie mogę zrobić z barem? Również dlaczego przekazujesz te argumenty bezpośrednio do a.method? nie mogłeś przekazać ich do Foo(), gdy tworzone jest wystąpienie i używać ich przez Foo()? A jeśli tak, to jak? Co byś zrobił, gdyby instancja została utworzona w innej klasie, gdyby nie zdefiniowano Foo()? czy jest zawsze zdefiniowany? – Baf

+0

Jeśli instancja nie ma określonego atrybutu instancji, wówczas odwołuje się do atrybutu klasy i używa go. Jest to więc jeden sposób, aby każda instancja klasy współużytkowała dane. Czy to ma sens? (Dodałem kilka komentarzy w "__init__"). To pomaga? Jeśli chodzi o inne pytania, argumenty przekazywane do 'Foo()' przekazywane są dalej do '__init__'. Jeśli to pomaga, metody instancji są podobne do funkcji, z tym że ich pierwszym argumentem jest instancja użyta do wywołania tej metody. – mgilson

+0

Kiedy próbowałem utworzyć instancję myclass w innej klasie, nazwa nie zmieniła koloru, czy nie należałoby colley mieć nazwy klas? powiedzmy, że mam zmienną zdefiniowaną w myclass przez self.variable w __init__, jak mogę go używać w metodach klasy? czy mogę utworzyć instancję klasy innej w myclass przekazując zmienne do innej klasy, gdzie są one przypisane do self.othervariable i mogą być używane w całej klasie a jej metody nie muszą przekazywać ich do metody instancji w mojej klasie? – Baf

2

Sensem klasy jest to, że tworzą instancji, a instancja obudowuje zbiór danych. Zatem błędem jest twierdzenie, że zmienne są globalne w obrębie klasy: powiedzmy raczej, że instancja przechowuje atrybuty, a ta instancja może odwoływać 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 do uzyskania dostępu do atrybutów instancji - tj. instance.whatever.

22

Oto prosty przykład wykorzystania klas: Załóżmy, że jesteś instytutem finansowym. Chcesz, aby konta Twoich klientów były zarządzane przez komputer. Musisz więc zamodelować te konta. Właśnie tam zaczynają się zajęcia. Praca z klasami nazywana jest programowaniem obiektowym. W klasach modelujesz obiekty świata rzeczywistego na swoim komputerze. A więc, czego potrzebujemy do modelowania prostego konta bankowego? Potrzebujemy zmiennej, która oszczędza równowagę i która zapisuje nazwę klienta. Dodatkowo, niektóre metody wprowadzania i zmniejszania salda. To może wyglądać następująco:

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 mechanizmu. def __init__(self, name, money) jest konstruktorem klas. Buduje obiekt w pamięci. Jeśli chcesz teraz otworzyć nowe konto, musisz utworzyć instancję klasy. Aby to zrobić, musisz zadzwonić do konstruktora i przekazać potrzebne parametry. W Pythonie konstruktor nazywa po imieniu klasach męska:

spidermans_account = bankaccount("SpiderMan", 1000) 

Jeśli Spiderman chce kupić M.J. nowy pierścień musi on wycofać pieniądze. mógłby wywołać metodę withdraw na swoim koncie:

spidermans_account.withdraw_money(100) 

Jeśli chce zobaczyć równowagi nazywa:

spidermans_account.show_balance() 

Całość o klasach jest modelowanie obiektów, ich atrybuty i mechanizmów. Aby utworzyć obiekt, wykonaj instancję jak w przykładzie. Wartości są przekazywane do klas metodami getter i ustawiającymi, takimi jak `earn_money() '. Te metody uzyskują dostęp do zmiennych obiektów. Jeśli chcesz, aby twoja klasa przechowywała inny obiekt, musisz zdefiniować zmienną dla tego obiektu w konstruktorze.

+0

Thx Man bardzo ilustracyjny! jeszcze raz mógłbym zaakceptować to również jako odpowiedź, ponieważ dało mi to kilka dobrych wglądów, ale odpowiedź MGILSONA jest łatwiejsza do przeniesienia do mojego kodu e-mailowego. Szkoda, że ​​cała dokumentacja Pythona nie została napisana tak jak wy tutaj, id spędził mniej czasu na stackoverflow: P! Proszę nie linkuj mnie teraz, ale naprawdę myślę, że dokumentacja Pythona jest dość słaba pod względem zrozumiałości! Jeszcze raz dzięki MAxPowers pomogło to całkiem sporo! – Baf

+0

@Baf - tak jak wszystko inne, daj mu trochę czasu. Gdy zaczniesz się uczyć terminologii rzeczy, dokumentacja Pythona jest naprawdę bardzo dobra. Innymi słowy, po prostu poświęć trochę czasu, aby podskoczyć ponad krzywą uczenia się, a będziesz rosnąć, aby kochać dokumenty, tak jak reszta z nas. – mgilson

+0

I +1 za interesujący przykład. – mgilson