Perhatikan kode berikut:
class Base(object):
@classmethod
def do(cls, a):
print cls, a
class Derived(Base):
@classmethod
def do(cls, a):
print 'In derived!'
# Base.do(cls, a) -- can't pass `cls`
Base.do(a)
if __name__ == '__main__':
d = Derived()
d.do('hello')
> $ python play.py
> In derived!
> <class '__main__.Base'> msg
Dari Derived.do
, bagaimana cara menelepon Base.do
?
Saya biasanya akan menggunakan super
atau bahkan nama kelas dasar secara langsung jika ini adalah metode objek normal, tetapi tampaknya saya tidak dapat menemukan cara untuk memanggil metode kelas di kelas dasar.
Dalam contoh di atas, Base.do(a)
mencetak Base
kelas, bukan Derived
kelas.
python
class
overriding
class-method
Sridhar Ratnakumar
sumber
sumber
Jawaban:
Jika Anda menggunakan kelas gaya baru (yaitu berasal dari
object
Python 2, atau selalu dengan Python 3), Anda dapat melakukannya dengansuper()
seperti ini:Ini adalah bagaimana Anda akan memanggil kode dalam versi kelas dasar dari metode (yaitu
print cls, a
), dari kelas turunan, dengancls
disetel ke kelas turunan.sumber
super
metode kelas juga.object
. (setidaknya di Python 2, tetapi di Py3 saya pikir semua kelas bergaya baru, IIRC) Jika tidak, Anda harus melakukannyaBase.do(self, ...)
, saya pikir, dengan demikian meng -hard-coding nama superclass.Derived.do()
, bukankahcls
sama denganDerived
?Derived
tetapi bukan dari subkelas, maka ya.ini sudah lama, tetapi saya pikir saya mungkin telah menemukan jawabannya. Saat Anda mendekorasi metode untuk menjadi metode kelas, metode tak terikat asli disimpan di properti bernama 'im_func':
sumber
__func__
pada python 2.7 dan 3Ini bekerja untuk saya:
sumber
cls
Argumen kemudian akan terikatBase
bukanDerived