ฉันจะเริ่มต้นคลาสพื้นฐาน (ขั้นสูง) ได้อย่างไร
class SuperClass(object):
def __init__(self, x):
self.x = x
class SubClass(SuperClass):
def __init__(self, y):
self.y = y
ใช้super
วัตถุเพื่อให้แน่ใจว่าคุณได้รับวิธีการถัดไป (เป็นวิธีการที่ถูกผูกไว้) ในลำดับการแก้ปัญหาวิธีการ ใน Python 2 คุณต้องส่งชื่อคลาสและself
ไปที่ super เพื่อค้นหา__init__
วิธีการที่ถูกผูกไว้:
class SubClass(SuperClass):
def __init__(self, y):
super(SubClass, self).__init__('x')
self.y = y
ใน Python 3 มีเวทมนตร์เล็กน้อยที่ทำให้อาร์กิวเมนต์super
ไม่จำเป็น - และข้อดีอีกอย่างคือมันทำงานได้เร็วขึ้นเล็กน้อย:
class SubClass(SuperClass):
def __init__(self, y):
super().__init__('x')
self.y = y
การเข้ารหัสผู้ปกครองแบบฮาร์ดโค้ดด้านล่างนี้จะป้องกันไม่ให้คุณใช้การสืบทอดร่วมกัน:
class SubClass(SuperClass):
def __init__(self, y):
SuperClass.__init__(self, 'x') # don't do this
self.y = y
โปรดทราบว่า__init__
อาจกลับมาเท่านั้นNone
- มีวัตถุประสงค์เพื่อแก้ไขวัตถุในสถานที่
บางสิ่งบางอย่าง __new__
มีอีกวิธีหนึ่งในการเริ่มต้นอินสแตนซ์ - และเป็นวิธีเดียวสำหรับคลาสย่อยของประเภทที่ไม่เปลี่ยนรูปใน Python ดังนั้นจึงจำเป็นหากคุณต้องการคลาสย่อยstr
หรือtuple
หรือวัตถุอื่นที่ไม่เปลี่ยนรูป
คุณอาจคิดว่ามันเป็นวิธีการคลาสเพราะได้รับอาร์กิวเมนต์คลาสโดยปริยาย แต่จริงๆแล้วมันเป็นวิธีคงที่ ดังนั้นคุณต้องโทร__new__
ด้วยcls
อย่างชัดเจน
โดยปกติเราจะส่งคืนอินสแตนซ์จาก__new__
ดังนั้นหากคุณเป็นเช่นนั้นคุณต้องเรียกฐานของคุณ__new__
ผ่านด้วยsuper
เช่นกันในคลาสพื้นฐานของคุณ ดังนั้นหากคุณใช้ทั้งสองวิธี:
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 หลีกเลี่ยงความแปลกเล็กน้อยของการโทรขั้นสูงที่เกิดจาก__new__
การเป็นวิธีการคงที่ แต่คุณยังต้องส่งcls
ต่อไปยังวิธีที่ไม่ถูกผูกไว้__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')