Saya telah menemukan bahwa kedua pekerjaan berikut:
class Foo():
def a(self):
print "hello"
class Foo(object):
def a(self):
print "hello"
Haruskah semua kelas Python memperluas objek? Apakah ada masalah potensial dengan tidak memperluas objek?
python
inheritance
Kara
sumber
sumber
class Foo():
danclass Foo:
? Seperti yang saya amati, keduanya bekerja dalam Python 3.Jawaban:
Dalam Python 2, tidak mewarisi dari
object
akan membuat kelas gaya lama, yang, di antara efek lainnya, menyebabkantype
memberikan hasil yang berbeda:vs.
Juga aturan untuk pewarisan berganda berbeda dalam hal yang saya bahkan tidak akan mencoba untuk meringkasnya di sini. Semua dokumentasi bagus yang pernah saya lihat tentang MI menjelaskan kelas gaya baru.
Akhirnya, kelas gaya lama telah menghilang dalam Python 3, dan pewarisan dari
object
menjadi tersirat. Jadi, selalu lebih suka kelas-kelas gaya baru kecuali jika Anda perlu compat mundur dengan perangkat lunak lama.sumber
Dalam Python 3, kelas diperluas
object
secara implisit, apakah Anda mengatakannya sendiri atau tidak.Di Python 2, ada kelas gaya lama dan gaya baru . Untuk memberi sinyal suatu kelas adalah gaya baru, Anda harus mewarisi secara eksplisit dari
object
. Jika tidak, implementasi gaya lama digunakan.Anda biasanya menginginkan kelas gaya baru. Mewarisi dari
object
secara eksplisit. Perhatikan bahwa ini juga berlaku untuk kode Python 3 yang bertujuan agar kompatibel dengan Python 2.sumber
Dalam python 3 Anda dapat membuat kelas dalam tiga cara berbeda & secara internal mereka semua sama (lihat contoh). Tidak masalah bagaimana Anda membuat kelas, semua kelas di python 3 mewarisi dari objek khusus yang disebut objek . Objek kelas adalah kelas mendasar dalam python dan menyediakan banyak fungsi seperti metode double-underscore, deskriptor, metode super (), metode properti () dll.
Contoh 1.
Contoh 2.
Contoh 3.
sumber
object
membuat referensi ke built-inobject
. Jika kita harus memperhitungkan bahwa pengenal bawaan CPython apa pun dapat diganti, kita hampir tidak dapat membuat beberapa pernyataan tentang model data. Bisakah itu diperdebatkan dengan serius yangstr
tidak selalu menerima string sebagai argumen karena orang dapat menetapkanbuiltins.str = None
?Ya, semua kelas Python harus memperluas (atau lebih tepatnya subkelas, ini Python di sini) objek. Walaupun biasanya tidak ada masalah serius yang akan terjadi, dalam beberapa kasus (seperti dengan banyak pohon warisan) ini akan menjadi penting. Ini juga memastikan kompatibilitas yang lebih baik dengan Python 3.
sumber
Seperti jawaban lain yang telah dibahas, pewarisan Python 3 dari objek adalah implisit. Tetapi mereka tidak menyatakan apa yang harus Anda lakukan dan apa itu konvensi.
Contoh dokumentasi Python 3 semuanya menggunakan gaya berikut yang merupakan konvensi, jadi saya sarankan Anda mengikuti ini untuk kode apa pun di Python 3.
Sumber: https://docs.python.org/3/tutorial/classes.html#class-objects
Contoh kutipan:
Kutipan lain:
sumber
di python3 tidak ada perbedaan, tetapi di python2 tidak memperluas
object
memberi Anda kelas gaya lama; Anda ingin menggunakan kelas gaya baru di atas kelas gaya lama.sumber