Apakah perlu atau berguna untuk mewarisi dari objek python dengan Python 3.x?

94

Dalam versi python yang lebih lama ketika Anda membuat kelas dengan python, itu dapat mewarisi dari objek yang sejauh yang saya mengerti elemen python bawaan khusus yang memungkinkan objek Anda menjadi objek gaya baru.

Bagaimana dengan versi yang lebih baru (> 3.0 dan 2.6)? Saya mencari di Google tentang objek kelas tetapi saya mendapatkan begitu banyak hasil (untuk alasan yang jelas). Ada petunjuk?

Terima kasih!

thomas
sumber
2
Jika kode Anda juga akan digunakan di bawah 2.x, sebaiknya eksplisit.
smci
1
Ini dijawab dengan baik dalam pertanyaan ini: stackoverflow.com/questions/4015417/…
nngeek

Jawaban:

94

Anda tidak perlu mewarisi dari objectuntuk memiliki gaya baru di python 3. Semua kelas bergaya baru.

SilentGhost
sumber
5
Perhatikan bahwa ini berarti semua kelas mewarisi dari objectterlepas apakah mengetik eksplisit (object)atau tidak dengan Python 3.1
u0b34a0f6ae
8
Anda tidak perlu melakukannya, tetapi "Porting kode Python ke Python 3" mengatakan bahwa itu masih valid: docs.python.org/py3k/howto/pyporting.html#subclass-object Juga: docs.python.org/reference/ …
hyperboreean
Dari posting ini yang disebutkan dalam komentar nngeek, sepertinya referensi stabil yang baik untuk gaya lama vs gaya baru (hanya relevan dengan Py2) adalah: docs.python.org/2/reference/… - tautan di atas sepertinya ada sejak berubah.
Eric Cousineau
80

Saya menyadari bahwa ini adalah pertanyaan lama, tetapi perlu dicatat bahwa bahkan di python 3 kedua hal ini tidak persis sama.

Jika Anda secara eksplisit mewarisi dari object, apa yang sebenarnya Anda lakukan adalah mewarisi dari builtins.object apa pun yang menunjuk pada saat itu.

Oleh karena itu, saya dapat memiliki beberapa modul (sangat aneh) yang menimpa objek karena beberapa alasan. Kami akan menyebut modul pertama ini "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

Kemudian di beberapa file lain ("klasses.py"):

class Greeter(object):
    pass

class NonGreeter:
    pass

Kemudian di file ketiga (yang sebenarnya dapat kita jalankan):

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

Jadi Anda dapat melihat bahwa, dalam kasus di mana ia secara eksplisit mewarisi dari objek, kami mendapatkan perilaku yang berbeda dari yang Anda izinkan dengan pewarisan implisit.

Philip Adler
sumber
14
Ini relevan karena secara umum yang diharapkan adalah perilaku itu setara. Itu tidak setara, oleh karena itu pengamatan saya.
Philip Adler