ฉันจะเริ่มต้นคลาสพื้นฐาน (ขั้นสูง) ได้อย่างไร
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')