Pertanyaan Memanggil classmethod kelas dasar dengan Python


Pertimbangkan 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 saya memanggil Base.do?

Saya biasanya akan menggunakan super atau bahkan nama kelas dasar secara langsung jika ini adalah metode objek normal, tetapi ternyata saya tidak dapat menemukan cara untuk memanggil classmethod di kelas dasar.

Dalam contoh di atas, Base.do(a) cetakan Base kelas bukan Derived kelas.


76
2017-08-12 23:07


asal


Jawaban:


Jika Anda menggunakan kelas gaya baru (yaitu berasal object dengan Python 2, atau selalu dengan Python 3), Anda dapat melakukannya dengan super() seperti ini:

super(Derived, cls).do(a)

Ini adalah bagaimana Anda akan memanggil kode dalam versi metode kelas dasar (yaitu print cls, a), dari kelas turunan, dengan cls diatur ke kelas turunan.


86
2017-08-12 23:09



ini sudah lama, tapi saya pikir saya mungkin telah menemukan jawaban. Ketika Anda menghias metode untuk menjadi metode kelas, metode tidak terikat asli disimpan dalam properti bernama 'im_func':

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.im_func(cls, a)

if __name__ == '__main__':
    d = Derived()
    d.do('hello')

10
2018-04-15 21:01



Ini bekerja untuk saya:

Base.do('hi')

-2
2017-08-12 23:12