W starszej wersji Pythona, kiedy tworzysz klasę w Pythonie, może ona dziedziczyć z obiektu, który jest, o ile rozumiem, specjalny wbudowany element Pythona, który pozwala twojemu obiektowi być obiektem w nowym stylu.
A co z nowszą wersją (> 3.0 i 2.6)? Przeszukałem obiekt klasy, ale otrzymałem tak dużo wyników (z oczywistych powodów). Jakaś wskazówka?
Podziękować!
python
python-3.x
Tomasz
źródło
źródło
Odpowiedzi:
Nie musisz dziedziczyć z,
object
aby mieć nowy styl w Pythonie 3. Wszystkie klasy są w nowym stylu.źródło
object
niezależnie od tego, czy(object)
Zdaję sobie sprawę, że to stare pytanie, ale warto zauważyć, że nawet w Pythonie 3 te dwie rzeczy nie są tym samym.
Jeśli wyraźnie dziedziczysz po
object
, to, co faktycznie robisz, jest dziedziczeniembuiltins.object
niezależnie od tego, na co to wskazuje w danym momencie.Dlatego mógłbym mieć jakiś (bardzo zwariowany) moduł, który z jakiegoś powodu nadpisuje obiekt. Nazwijmy ten pierwszy moduł „newobj.py”:
import builtins old_object = builtins.object # otherwise cyclic dependencies class new_object(old_object): def __init__(self, *args, **kwargs): super(new_object, self).__init__(*args, **kwargs) self.greeting = "Hello World!" builtins.object = new_object #overrides the default object
Następnie w innym pliku („klasses.py”):
class Greeter(object): pass class NonGreeter: pass
Następnie w trzecim pliku (który faktycznie możemy uruchomić):
import newobj, klasses # This order matters! greeter = klasses.Greeter() print(greeter.greeting) # prints the greeting in the new __init__ non_greeter = klasses.NonGreeter() print(non_greeter.greeting) # throws an attribute error
Możesz więc zobaczyć, że w przypadku, gdy dziedziczenie jest jawne po obiekcie, uzyskujemy inne zachowanie niż wtedy, gdy zezwalasz na niejawne dziedziczenie.
źródło