Python klasa nasljeđuje objekt

Postoji li razlog zašto deklaracija razreda mora naslijediti object ?

Upravo sam našao kod koji to radi, i ne mogu naći dobar razlog.

 class MyClass(object): # class code follows... 
870
25 окт. tjvr postavljen je 25. listopada 2010-10-25 17:15 '10 u 17:15 2010-10-25 17:15
@ 7 odgovora

Postoji li razlog da se deklaracija klase naslijedi od object ?

tl; dr. U Pythonu 3, osim kompatibilnosti između Pythona 2 i 3, nema razloga. Postoji mnogo razloga u Pythonu 2.


Povijest Pythona 2.x:

U Pythonu 2.x (od 2.2 nadalje) postoje dva stila klasa ovisno o prisutnosti ili odsutnosti object kao osnovne klase:

  1. klasične klase stila : nemaju object kao osnovnu klasu:

     >>> class ClassicSpam: # no base class ... pass >>> ClassicSpam.__bases__ () 
  2. "nove" klase stila : one imaju, izravno ili neizravno (primjerice naslijediti od ugrađenog tipa ), object kao osnovnu klasu:

     >>> class NewSpam(object): # directly inherit from object ... pass >>> NewSpam.__bases__ (<type 'object'>,) >>> class IntSpam(int): # indirectly inherit from object... ... pass >>> IntSpam.__bases__ (<type 'int'>,) >>> IntSpam.__bases__[0].__bases__ # ... because int inherits from object (<type 'object'>,) 

Bez sumnje, prilikom pisanja razreda uvijek ćete se htjeti prebaciti na klase novog stila. Prednosti u ovome su brojne, da nabrojimo neke od njih:

  • Držite podršku . Konkretno, sljedeći deskriptori postali su mogući pomoću deskriptora:

    1. classmethod : metoda koja uzima klasu kao implicitni argument umjesto instance.
    2. staticmethod : metoda koja ne dobiva implicitni self argument kao prvi argument.
    3. Svojstva s property : Stvaranje funkcija za kontrolu primitka, instalacije i brisanja atributa.
    4. __slots__ : štedi potrošnju memorije klase i ubrzava pristup atributima. Naravno, to nameće ograničenja .
  • Statička metoda __new__ : omogućuje vam da prilagodite kako se stvaraju nove instance klasa.

  • Order Resolution Method (MRO) : kojim redoslijedom će izgledati osnovne klase klase prilikom pokušaja određivanja metode za poziv.

  • super pozivi vezani uz MRO. Također pogledajte, super() se smatra super.

Ako ne naslijedite od object , zaboravite na njega. Sveobuhvatniji opis prethodnih točaka označavanja, zajedno s drugim prednostima "novih" klasa stila možete pronaći ovdje .

Jedan od nedostataka novih klasa stilova je taj da sama klasa zahtijeva više memorije. Osim ako, naravno, ne stvarate mnogo klasnih predmeta, sumnjam da će to biti problem, a to će biti negativno uranjanje u more pozitivnog.


Povijest Pythona 3.x:

U Pythonu 3 sve je pojednostavljeno. Postoje samo klase novog stila (nazvane jednostavno klase), tako da je jedina razlika u dodavanju object to što trebate unijeti još 8 znakova. Ovo je:

 class ClassicSpam: pass 

potpuno ekvivalentno (osim njihova imena :-) ovome:

 class NewSpam(object): pass 

i na ovo:

 class Spam(): pass 

Svatko ima svoj object u svojim __bases__ .

 >>> [object in cls.__bases__ for cls in {Spam, NewSpam, ClassicSpam}] [True, True, True] 

Što trebate učiniti?

U Pythonu 2: uvijek naslijediti od object eksplicitno. Dobijte pogodnosti.

U Pythonu 3: naslijediti od object ako pišete kod koji pokušava biti neovisan o Pythonu, to jest, trebao bi raditi u Pythonu 2 i Pythonu 3. Inače, to nije važno, jer ga Python umeće za vas iza kulisa.

368
12 июля '17 в 18:34 2017-07-12 18:34 Odgovor je dao Jim Fasarakis Hilliard 12. srpnja '17. U 6:34 2017-07-12 18:34

Python 3.x:
class MyClass(object): = klasa novog stila
class MyClass: = klasa novog stila (implicitno naslijeđena od objekta)

Python 2.x:
class MyClass(object): = klasa novog stila
class MyClass: = OLD STYLE CLASS

objašnjenje:

Kada definirate osnovne klase u Pythonu 3.x, možete ispustiti objekt iz definicije. Međutim, to može otvoriti vrata ozbiljnom problemu praćenja problema ...

border=0

Python je uveo klase novog stila u Python 2.2, a sada su stara klasa stvarno stara. Rasprava o klasama starog stila zakopana je u dokumentima 2.x i ne postoji u dokumentima 3.x.

Problem je u tome što je sintaksa klasa starog stila u Pythonu 2.x slična alternativnoj sintaksi za klase novog stila u Pythonu 3.x. Python 2.x je još uvijek vrlo široko korišten (na primjer, GAE, Web2Py), a bilo koji kod (ili koder) koji nenamjerno vodi definicije 3.x klasa stila u kod 2.x na kraju će imati neke ozbiljno zastarjele bazne objekte. , A budući da stara klasa nije na bilo kojem radaru, vjerojatno ne znaju što ih je pogodilo.

Dakle, samo reci to dug put i spremi neke suze programere 2.x.

502
26 февр. odgovor je dao Yarin 26. veljače. 2012-02-26 00:15 '12 u 0:15 2012-02-26 00:15

Da, to je predmet "novog stila". To je bila značajka uvedena u python2.2.

Novi objekti stila imaju objektni model koji se razlikuje od klasičnih objekata, a neke stvari neće raditi ispravno sa objektima starog stila, kao što su super() , @property i deskriptori. Pogledajte ovaj članak za dobar opis onoga što je nova klasa stila.

Dakle, link za opisivanje razlika: Koja je razlika između starog stila i novog stila nastave u Pythonu?

391
25 окт. odgovor je dat Jerub 25. listopada. 2010-10-25 17:20 '10 u 17:20 2010-10-25 17:20

Priča iz učenja Pythona na teži način :

Izvorna prezentacija klase Python razbijena je na mnogo ozbiljnih načina. Do trenutka kada je ta pogreška priznata, bilo je prekasno i trebalo je to podržati. Da bi riješili problem, trebali su "novi razred" kako bi "stare klase" nastavile s radom, ali možete koristiti novu, ispravniju verziju.

Odlučili su da će riječ "objekt" u donjem slučaju biti "klasa" iz koje ćete naslijediti stvoriti klasu. To je zbunjujuće, ali klasa nasljeđuje od klase pod nazivom "objekt" kako bi napravila klasu, ali u stvarnosti to nije objekt, nego klasa, ali ne zaboravite naslijediti od objekta.

Također je lako za vas znati koja je razlika između klasa novog stila i klasa starog stila da su klase novog stila uvijek naslijeđene od klasa object ili iz druge klase koja nasljeđuje od object :

 class NewStyle(object): pass 

Drugi primjer:

 class AnotherExampleOfNewStyle(NewStyle): pass 

Iako stara klasa izgleda ovako:

 class OldStyle(): pass 

A starija dječja klasa izgleda ovako:

 class OldStyleSubclass(OldStyle): pass 

Možete vidjeti da stara klasa nije naslijeđena od bilo koje druge klase, ali klasa starog stila može, naravno, naslijediti jedni od drugih. Nasljeđivanje od objekta osigurava da je određena funkcionalnost dostupna u svakoj Python klasi. U Pythonu 2.2 uvedene su nove klase stila

30
04 нояб. odgovor je disp_name 04 Nov. 2014-11-04 13:54 '14 u 13:54 2014-11-04 13:54

Da, povijesno je . Bez toga stvara klasu u starom stilu.

Ako koristite type() za objekt starog stila, jednostavno dobijete "instancu". Na objektu novog stila dobivate njegovu klasu.

25
25 окт. odgovor dati knitti 25. listopada. 2010-10-25 17:20 '10 u 17:20 2010-10-25 17:20

Sintaksa za stvaranje klase je:

 class <ClassName>(superclass): #code follows 

U nedostatku drugih superrazreda koje želite specifično naslijediti, superclass mora uvijek biti object , koji je korijen svih klasa u Pythonu.

object je tehnički korijen klasa "novog stila" u Pythonu. No, klase novog stila danas su jednako dobre kao i jedini stil nastave.

Ali ako ne koristite eksplicitnu uporabu object riječi pri stvaranju klasa, onda, kao što je već spomenuto, Python 3.x implicitno nasljeđuje od nadklasa object . Ali mislim da je eksplicitno uvijek bolje nego implicitno (pakao)

veza

6
20 окт. odgovor je dan kmario23 20 okt. 2016-10-20 08:37 '16 u 8:37 2016-10-20 08:37

To stvara klasu novog stila .

1
25 окт. odgovor dati SLaks 25. listopada 2010-10-25 17:20 '10 u 17:20 2010-10-25 17:20