Klasa Pythona dziedziczy obiekt

Czy Jest jakiś powód, dla którego deklaracja klasy dziedziczy po object?

Właśnie znalazłem jakiś kod, który to robi i nie mogę znaleźć dobrego powodu.

class MyClass(object):
    # class code follows...
Author: Jim Fasarakis Hilliard, 2010-10-25

7 answers

Czy Jest jakiś powód, dla którego deklaracja klasy dziedziczy po object?

TL;dr: w Pythonie 3, oprócz zgodności pomiędzy Pythonem 2 i 3, nie ma powodu. W Pythonie 2, wiele powodów .


Python 2.historia x:

W Pythonie 2.x (począwszy od 2.2) istnieją dwa style klas w zależności od obecności lub braku object jako klasy bazowej:

  1. "klasyczna" style klasy: nie mają object jako klasa bazowa:

    >>> class ClassicSpam:      # no base class
    ...     pass
    >>> ClassicSpam.__bases__
    ()
    
  2. "nowe klasy" style: mają, bezpośrednio lub pośrednio (np. dziedziczą z wbudowanego typu), object jako klasa bazowa:

    >>> 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 wątpienia, pisząc zajęcia będziesz zawsze chcesz iść na zajęcia w Nowym Stylu. Korzyści z tego są liczne, aby wymienić niektóre z nich:

  • Wsparcie dla deskryptorów . W szczególności następujące konstrukcje są możliwe dzięki deskryptorom:

    1. classmethod: metoda, która odbiera klasę jako argument niejawny zamiast instancji.
    2. staticmethod: metoda, która nie otrzymuje argumentu implicit self jako pierwszego argumentu.
    3. właściwości z property: tworzenie funkcji do zarządzania uzyskiwaniem, ustawianiem i usuwaniem atrybutów.
    4. __slots__: oszczędza zużycie pamięci klasy, a także powoduje szybsze dostęp do atrybutów. Oczywiście, to nie narzuca ograniczenia .
  • Na __new__ metoda statyczna: pozwala dostosować sposób tworzenia nowych instancji klas.

  • Method resolution order (MRO) : w jakiej kolejności klasy bazowe klasy będą wyszukiwane podczas próby rozwiązania, którą metodę wywołać.

  • Związane z MRO, super połączenia . Zobacz też, super() rozważane super.

Jeśli nie odziedziczysz po object, zapomnij o tym. Bardziej wyczerpujący opis poprzednich punktów punktowych wraz z innymi atutami "nowych" klas stylów można znaleźć tutaj .

Jedną z wad klas nowego stylu jest to, że sama klasa jest bardziej wymagająca pamięci. Chyba, że tworzysz wiele obiektów klasowych, ale wątpię, aby to był problem i jest to negatywne tonie w morzu pozytywów.

Python 3.x story:

W Pythonie 3 rzeczy są uproszczone. Istnieją tylko klasy nowego stylu (nazywane po prostu klasami), więc jedyną różnicą w dodaniu object jest wymóg wpisania 8 znaków więcej. To:

class ClassicSpam:
    pass

Jest całkowicie równoznaczne (poza nazwą : -) z tym:

class NewSpam(object):
     pass

I do tego:

class Spam():
    pass

Wszystkie mają object w swoich __bases__.

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

Więc, co powinieneś zrobić?

W Pythonie 2: zawsze dziedziczyć od object jawnie . Zdobądź korzyści.

W Pythonie 3: inherit from object Jeśli piszesz kod, który próbuje być agnostyczny w Pythonie, to znaczy, że musi działać zarówno w Pythonie 2, jak i w Pythonie 3. W przeciwnym razie nie, to naprawdę nie ma znaczenia, ponieważ Python wstawia go za kulisami.

 293
Author: Jim Fasarakis Hilliard,
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
2018-03-21 12:24:33

Python 3.x:
class MyClass(object): = klasa w Nowym Stylu
class MyClass: = klasa new-style (domyślnie dziedziczy z obiektu)

Python 2.x:
class MyClass(object): = klasa w Nowym Stylu
class MyClass: = klasa w starym stylu

Wyjaśnienie:

Podczas definiowania klas bazowych w Pythonie 3.x, możesz usunąć obiekt z definicji. Jednak może to otworzyć drzwi dla poważnie trudnego do wyśledzenia problemu ... ]}

Python wprowadził klasy nowego stylu w Pythonie 2.2, a przez teraz zajęcia w starym stylu są naprawdę dość stare. Dyskusja klas starego stylu jest Zakopane w 2.x docs , a nieistniejące w 3.x docs.

Problem polega na tym, składnia klas starego stylu w Pythonie 2.x jest taka sama jak składnia alternatywna dla klas nowego stylu w Pythonie 3.x . Python 2.x jest nadal bardzo szeroko stosowany (np. GAE, Web2Py), a każdy kod (lub koder) nieświadomie wprowadzający 3.X-style klasy definicje na 2.x code skończy się na czymś poważnym przestarzałe obiekty bazowe. A ponieważ klasy w starym stylu nie są na niczyim radarze, prawdopodobnie nie będą wiedzieć, co ich uderzyło.

Więc po prostu przeliteruj to na dłuższą drogę i zapisz jakieś 2.X developer the tears.

 499
Author: Yarin,
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
2014-04-28 19:24:35

Tak, jest to obiekt "nowego stylu". Była to funkcja wprowadzona w python2. 2.

Obiekty nowego stylu mają inny model obiektowy niż obiekty Klasyczne, a niektóre rzeczy nie będą działać poprawnie z obiektami starego stylu, na przykład, super(), @property i deskryptory. Zobacz Ten artykuł , aby dowiedzieć się, czym jest nowa klasa stylu.

Więc link do opisu różnic: Jaka jest różnica między klasami Starego i nowego stylu w Pythonie?

 390
Author: Jerub,
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-10-27 18:54:12

Historia z Naucz się Pythona trudnym sposobem :

Oryginalna wersja Pythona klasy została złamana w wielu poważnych sposoby. Zanim usterka została rozpoznana, było już za późno., i musieli to poprzeć. Aby rozwiązać problem, potrzebowali jakiś styl "nowej klasy", żeby "stare klasy" działały dalej ale możesz użyć nowej, bardziej poprawnej wersji.

Zdecydowali, że użyją słowa" obiekt", z małej litery, aby być na "klasa", z której dziedziczysz, aby stworzyć klasę. To jest mylące., ale klasa dziedziczy z klasy o nazwie "object", aby utworzyć klasę, ale to nie jest obiekt naprawdę jego klasa, ale nie zapomnij dziedziczyć z obiektu.

Również po to, abyś wiedział, jaka jest różnica między klasami w Nowym stylu a klasami w starym stylu, jest to, że klasy w Nowym Stylu zawsze dziedziczą z klasy object lub z innej klasy, która odziedziczyła z klasy object:

class NewStyle(object):
    pass

Inny przykład jest:

class AnotherExampleOfNewStyle(NewStyle):
    pass

Podczas gdy klasy bazowe w starym stylu wyglądają tak:

class OldStyle():
    pass

A Klasa dziecięca w starym stylu wygląda tak:

class OldStyleSubclass(OldStyle):
    pass

Widać, że klasy bazowe starego stylu nie dziedziczą po żadnej innej klasie, jednak klasy starego stylu mogą oczywiście dziedziczyć po sobie. Dziedziczenie z obiektu gwarantuje, że pewna funkcjonalność jest dostępna w każdej klasie Pythona. W Pythonie 2.2 wprowadzono nowe klasy stylów

 30
Author: disp_name,
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-12-17 08:59:43

Tak, to historyczne . Bez niego tworzy klasę w starym stylu.

Jeśli użyjesz type() Na obiekcie w starym stylu, otrzymasz po prostu "instancję". Na obiekcie w Nowym stylu otrzymujesz jego klasę.

 24
Author: knitti,
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
2018-02-15 14:06:28

Składnia instrukcji tworzenia klasy:

class <ClassName>(superclass):
    #code follows

W przypadku braku innych superklas, z których konkretnie chcesz dziedziczyć, superclass powinny być zawsze object, który jest korzeniem wszystkich klas w Pythonie.

object technicznie jest korzeniem klas" nowego stylu " w Pythonie. Ale zajęcia w Nowym Stylu są dziś tak dobre, jak jest jedynym stylem zajęć.

Ale jeśli nie używasz jawnie słowa object podczas tworzenia klas, to jako inne, Python 3.x domyślnie dziedziczy z superklasy object. Ale myślę, że explicit jest zawsze lepszy niż implicit (piekło)

Numer referencyjny

 6
Author: kmario23,
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-10-20 05:37:38
 1
Author: SLaks,
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
2010-10-25 14:20:09