Bagaimana cara menginisialisasi kelas dasar (super)?
class SuperClass(object):
def __init__(self, x):
self.x = x
class SubClass(SuperClass):
def __init__(self, y):
self.y = y
Gunakan super
objek untuk memastikan Anda mendapatkan metode berikutnya (sebagai metode terikat) dalam urutan resolusi metode. Di Python 2, Anda harus meneruskan nama kelas dan self
ke super untuk mencari __init__
metode terikat :
class SubClass(SuperClass):
def __init__(self, y):
super(SubClass, self).__init__('x')
self.y = y
Di Python 3, ada sedikit keajaiban yang membuat argumen menjadi super
tidak perlu - dan sebagai manfaat tambahannya bekerja sedikit lebih cepat:
class SubClass(SuperClass):
def __init__(self, y):
super().__init__('x')
self.y = y
Melakukan hardcode induk seperti ini di bawah ini mencegah Anda menggunakan multiple inheritance kooperatif:
class SubClass(SuperClass):
def __init__(self, y):
SuperClass.__init__(self, 'x') # don't do this
self.y = y
Perhatikan bahwa __init__
mungkin hanya mengembalikanNone
- ini dimaksudkan untuk mengubah objek di tempat.
Sesuatu __new__
Ada cara lain untuk menginisialisasi instance - dan ini satu-satunya cara untuk subclass dari tipe yang tidak dapat diubah dengan Python. Jadi diperlukan jika Anda ingin membuat subclass str
atau tuple
objek tetap lainnya.
Anda mungkin mengira itu metode kelas karena mendapat argumen kelas implisit. Tapi sebenarnya itu metode statis . Jadi Anda perlu menelepon __new__
dengan cls
eksplisit.
Kami biasanya mengembalikan instance from __new__
, jadi jika Anda melakukannya, Anda juga perlu memanggil basis Anda __new__
via super
juga di kelas dasar Anda. Jadi jika Anda menggunakan kedua metode tersebut:
class SuperClass(object):
def __new__(cls, x):
return super(SuperClass, cls).__new__(cls)
def __init__(self, x):
self.x = x
class SubClass(object):
def __new__(cls, y):
return super(SubClass, cls).__new__(cls)
def __init__(self, y):
self.y = y
super(SubClass, self).__init__('x')
Python 3 menghindari sedikit keanehan panggilan super yang disebabkan oleh __new__
metode statis, tetapi Anda masih perlu meneruskan cls
ke metode tidak terikat __new__
:
class SuperClass(object):
def __new__(cls, x):
return super().__new__(cls)
def __init__(self, x):
self.x = x
class SubClass(object):
def __new__(cls, y):
return super().__new__(cls)
def __init__(self, y):
self.y = y
super().__init__('x')