W tym kodzie:
class A(object):
def __init__(self):
self.x = 'Hello'
def method_a(self, foo):
print self.x + ' ' + foo
... self
zmienna reprezentuje instancję samego obiektu. Większość języków obiektowych przekazuje to jako parametr ukryty do metod zdefiniowanych na obiekcie; Python nie. Musisz to wyraźnie zadeklarować. Po utworzeniu wystąpienia A
klasy i wywołaniu jej metod zostanie ona przekazana automatycznie, jak w ...
a = A() # We do not pass any argument to the __init__ method
a.method_a('Sailor!') # We only pass a single argument
Ta __init__
metoda z grubsza reprezentuje konstruktor w Pythonie. Po wywołaniu A()
Python tworzy dla Ciebie obiekt i przekazuje go jako pierwszy parametr do __init__
metody. Wszelkie dodatkowe parametry (np. A(24, 'Hello')
) Również zostaną przekazane jako argumenty - w tym przypadku powodując zgłoszenie wyjątku, ponieważ konstruktor ich nie oczekuje.
x = 'Hello'
poza init, ale wewnątrz klasy? czy to jest jak Java, gdzie jest to samo, czy staje się jak zmienna statyczna, która jest inicjowana tylko raz?A.x
luba.x
. Należy pamiętać, że nadrzędnym go na określonej klasie nie wpłynie na bazę, więcA.x = 'foo'; a.x = 'bar'; print a.x; print A.x
wypiszebar
następniefoo
self
, to po prostu konwencja.object
deklaracji klasowej? Zauważyłem, że niektóre klasy mają to, a niektóre nieobject
ponieważ dzieje się tak domyślnie.Tak, masz rację, to są konstrukty oop.
__init__
jest konstruktorem klasy.self
Parametr odnosi się do przypadku obiektu (jakthis
C ++).__init__
Metoda jest wywoływana, gdy pamięć dla obiektu przeznaczono:Ważne jest, aby użyć
self
parametru w metodzie obiektu, jeśli chcesz zachować wartość w obiekcie. Jeśli na przykład zastosujesz taką__init__
metodę:Twoje
x
iy
parametry zostaną zapisane w zmiennych na stosie i zostaną odrzucone, gdy metoda init wyjdzie poza zakres. Ustawienie tych zmiennych jakoself._x
iself._y
ustawia je jako członkówPoint
obiektu (dostępne przez cały okres istnienia obiektu).źródło
self
być konstruktorem? Dlaczego w ogóle musisz to określić, czy nie byłoby lepiej, gdyby było to dorozumiane?Krótki przykładowy przykład
W nadziei, że to może trochę pomóc, oto prosty przykład, którego użyłem, aby zrozumieć różnicę między zmienną zadeklarowaną w klasie a zmienną zadeklarowaną w
__init__
funkcji:Wynik:
źródło
__init__
jest przekazywana do instancji klasy, a nie „statyczna” zmienna samej klasy o tej samej nazwie ...W skrócie:
self
jak sugeruje, odnosi się do samego siebie - obiektu, który wywołał metodę. Oznacza to, że jeśli masz N obiektów wywołujących metodę, wówczasself.a
będzie odwoływał się do osobnej instancji zmiennej dla każdego z N obiektów. Wyobraź sobie N kopii zmienneja
dla każdego obiektu__init__
to tak zwany konstruktor w innych językach OOP, takich jak C ++ / Java. Podstawową ideą jest to, że jest to specjalna metoda, która jest automatycznie wywoływana podczas tworzenia obiektu tej klasyźródło
__init__
działa jak konstruktor. Musisz przekazać „self” do dowolnej funkcji klasy jako pierwszy argument, jeśli chcesz, aby zachowywały się jak metody niestatyczne. „self” to zmienne instancji dla twojej klasy.źródło
Wypróbuj ten kod. Mam nadzieję, że pomoże to wielu programistom C, takim jak ja, nauczyć się Py.
Wynik:
Jay
Sum = 5
Doc - Inside Class
Doc - __init__ Constructor
Doc - Inside Show
Destructor Deleting object - Jay
źródło
Obiekty klasy obsługują dwa rodzaje operacji: odwołania do atrybutów i tworzenie instancji
Odwołania do atrybutów używają standardowej składni stosowanej dla wszystkich odniesień do atrybutów w Pythonie: obj.name. Prawidłowe nazwy atrybutów to wszystkie nazwy, które były w przestrzeni nazw klasy podczas tworzenia obiektu klasy. Jeśli więc definicja klasy wyglądała tak:
Następnie
MyClass.i
iMyClass.f
są ważne odniesienia cechę, powracający liczbę całkowitą i obiekt funkcję, odpowiednio. Można także przypisać atrybuty klas, dzięki czemu można zmienić wartośćMyClass.i
według przypisania.__doc__
jest również prawidłowym atrybutem zwracającym ciąg dokumentów należący do klasy: „Prosta przykładowa klasa”.Tworzenie instancji klasy wykorzystuje notację funkcji. Udawaj, że obiekt klasy jest funkcją bez parametrów, która zwraca nową instancję klasy. Na przykład:
Operacja tworzenia instancji („wywołanie” obiektu klasy) tworzy pusty obiekt. Wiele klas lubi tworzyć obiekty z instancjami dostosowanymi do określonego stanu początkowego. Dlatego klasa może zdefiniować specjalną metodę o nazwie
__init__()
, taką jak ta:Kiedy klasa definiuje
__init__()
metodę, instancja klasy automatycznie wywołuje__init__()
nowo utworzone wystąpienie klasy. W tym przykładzie nową zainicjowaną instancję można uzyskać przez:Oczywiście
__init__()
metoda może zawierać argumenty za większą elastycznością. W takim przypadku argumenty podane operatorowi tworzenia instancji klasy są przekazywane do__init__()
. Na przykład,Zaczerpnięte z oficjalnej dokumentacji, która w końcu najbardziej mi pomogła.
Oto mój przykład
Podczas tworzenia wystąpienia klasy Bill:
Dostajesz:
źródło
Miałem problem z niezrozumieniem tego samemu. Nawet po przeczytaniu tutaj odpowiedzi.
Aby właściwie zrozumieć
__init__
metodę, musisz zrozumieć siebie.Parametr własny
Argumenty akceptowane przez
__init__
metodę to:Ale przekazujemy mu tylko dwa argumenty:
Skąd wziął się dodatkowy argument?
Kiedy uzyskujemy dostęp do atrybutów obiektu, robimy to według nazwy (lub referencji). Tutaj instancja jest odniesieniem do naszego nowego obiektu. Dostęp do metody printargs obiektu instancji uzyskujemy za pomocą instance.printargs.
Aby uzyskać dostęp do atrybutów obiektu z poziomu
__init__
metody, potrzebujemy odwołania do obiektu.Za każdym razem, gdy wywoływana jest metoda, pierwszy argument jest przekazywany do głównego obiektu. Zgodnie z konwencją ten pierwszy argument zawsze wywołujesz sam w swoich metodach.
Oznacza to, że w
__init__
metodzie możemy wykonać:Tutaj ustawiamy atrybuty obiektu. Możesz to sprawdzić, wykonując następujące czynności:
takie wartości są znane jako atrybuty obiektu. Tutaj
__init__
metoda ustawia atrybuty arg1 i arg2 instancji.źródło: http://www.voidspace.org.uk/python/articles/OOP.shtml#the-init-method
źródło
Zauważ, że
self
faktycznie może to być dowolny poprawny identyfikator Pythona. Na przykład równie dobrze moglibyśmy napisać z przykładu Chrisa B.i działałoby dokładnie tak samo. Zaleca się jednak używanie self, ponieważ inni pythonerzy rozpoznają go łatwiej.
źródło
Zasadniczo musisz użyć słowa kluczowego „self”, gdy używasz zmiennej w wielu funkcjach w tej samej klasie. Jeśli chodzi o init , służy do ustawiania wartości domyślnych, ponieważ żadne inne funkcje z tej klasy nie są wywoływane.
źródło
__init__
jest w zasadzie funkcją, która „zainicjuje” / „aktywuje” właściwości klasy dla określonego obiektu, po utworzeniu i dopasowaniu do odpowiedniej klasy.self
reprezentuje obiekt, który odziedziczy te właściwości.źródło
„Ja” to odniesienie do instancji klasy
Teraz możemy utworzyć instancję foo i wywołać na niej metodę, w tym przypadku Python dodaje parametr własny:
Ale można go również przekazać, jeśli wywołanie metody nie znajduje się w kontekście wystąpienia klasy, poniższy kod robi to samo
Co ciekawe, nazwa zmiennej „self” to tylko konwencja. Poniższa definicja będzie działać dokładnie tak samo. Powiedziawszy, że jest to bardzo silna konwencja, której należy zawsze przestrzegać , ale mówi ona coś o elastycznej naturze języka
źródło
s
), pokazuje elastyczność Pythona.Tylko demo na pytanie.
źródło
W tym kodzie:
Tutaj
__init__
działa jako konstruktor dla klasy, a gdy instancja obiektu jest tworzona, funkcja ta jest wywoływana.self
reprezentuje obiekt instancji.Wynik powyższych stwierdzeń będzie następujący:
źródło
Pierwszy argument każdej metody klasy, w tym init, jest zawsze odniesieniem do bieżącej instancji klasy . Zgodnie z konwencją ten argument jest zawsze nazywany
self
. W metodzie initself
odnosi się do nowo utworzonego obiektu; w innych metodach klasowych odnosi się do instancji, której metoda została wywołana.Python nie zmusza cię do używania „ ja ”. Możesz nadać mu dowolną nazwę. Pamiętaj jednak, że pierwszym argumentem w definicji metody jest odwołanie do obiektu . Python dodaje
self
argument do listy; nie trzeba go dołączać podczas wywoływania metod. jeśli nie podałeś metody init, pojawi się błądinit
jest skrótem od inicjalizacji. Jest to konstruktor, który jest wywoływany podczas tworzenia instancji klasy i nie jest konieczny . Ale zwykle naszą praktyką jest pisanie metody init do ustawiania domyślnego stanu obiektu. Jeśli nie chcesz początkowo ustawiać żadnego stanu obiektu, nie musisz pisać tej metody.źródło
źródło
Podany przykład jest niepoprawny, więc pozwól, że utworzę na nim poprawny przykład:
Kiedy tworzymy instancję obiektu,
__init__
wywoływana jest w celu dostosowania obiektu po jego utworzeniu. To znaczy, kiedy wywołujemySomeObject
z'blah'
dołu (co może być czymkolwiek), zostaje ono przekazane do__init__
funkcji jako argumentblah
:self
Argumentem jest instancjąSomeObject
, która będzie przypisanaan_object
.Później możemy chcieć wywołać metodę na tym obiekcie:
Wykonywanie kropkowanego wyszukiwania, to znaczy,
an_object.method
wiąże instancję z instancją funkcji, a metoda (jak nazywana powyżej) jest teraz metodą „powiązaną” - co oznacza, że nie musimy jawnie przekazywać instancji do wywołania metody .Wywołanie metody pobiera instancję, ponieważ została powiązana z wyszukiwaniem kropkowanym, a po wywołaniu wykonuje dowolny kod, który został zaprogramowany do wykonania.
Niejawnie przekazany
self
argument jest wywoływanyself
konwencją. Możemy użyć dowolnej innej legalnej nazwy Python, ale prawdopodobnie zmienisz ją na inną.__init__
to specjalna metoda udokumentowana w dokumentacji modelu danych Pythona . Jest wywoływany natychmiast po utworzeniu instancji (zwykle za pośrednictwem__new__
- chociaż__new__
nie jest wymagany, chyba że podklasujesz niezmienny typ danych).źródło
Tutaj facet napisał całkiem dobrze i prosto: https://www.jeffknupp.com/blog/2014/06/18/improve-your-python-python-classes-and-object-oriented-programming/
Przeczytaj powyższy link jako odniesienie do tego:
źródło