Di Python 2.5, kode berikut memunculkan a TypeError
:
>>> class X:
def a(self):
print "a"
>>> class Y(X):
def a(self):
super(Y,self).a()
print "b"
>>> c = Y()
>>> c.a()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in a
TypeError: super() argument 1 must be type, not classobj
Jika saya mengganti class X
dengan class X(object)
, itu akan berhasil. Apa penjelasannya untuk ini?
Jawaban:
Alasannya adalah itu
super()
hanya beroperasi pada kelas gaya baru , yang dalam seri 2.x berarti meluas dariobject
:sumber
Selain itu, jangan gunakan super () kecuali Anda harus melakukannya. Bukan tujuan umum "hal yang benar" untuk dilakukan dengan kelas gaya baru yang mungkin Anda curigai.
Ada kalanya Anda mengharapkan banyak warisan dan Anda mungkin menginginkannya, tetapi sampai Anda mengetahui detail berbulu dari MRO, sebaiknya biarkan saja dan tetap berpegang pada:
sumber
__init__
) untuk melewati argumen dengan cara yang bersih dan masuk akal, jika tidak, Anda akan mendapatkan TypeErrors atau masalah debugging yang lebih buruk ketika seseorang mencoba multiply-inherit menggunakan kelas Anda. Kecuali jika Anda benar-benar merancang untuk mendukung MI dengan cara ini (yang cukup rumit), mungkin lebih baik untuk menghindari implikasisuper
bahwa metode ini aman untuk MI.Seandainya tidak ada jawaban di atas yang disebutkan dengan jelas. Kelas induk Anda perlu mewarisi dari "object", yang pada dasarnya akan mengubahnya menjadi kelas gaya baru.
sumber
Saya mencoba berbagai metode Xa (); Namun, mereka tampaknya memerlukan sebuah instance dari X untuk melakukan a (), jadi saya melakukan X (). a (self), yang tampaknya lebih lengkap dari jawaban sebelumnya, setidaknya untuk aplikasi yang saya temui. Tampaknya ini bukan cara yang baik untuk menangani masalah karena ada konstruksi dan penghancuran yang tidak perlu, tetapi berfungsi dengan baik.
Aplikasi khusus saya adalah modul cmd.Cmd Python, yang ternyata bukan objek NewStyle karena alasan tertentu.
Hasil Akhir:
sumber