0Pricing
Python Academy · บทเรียน

การเขียนทับเมธอดและ super()

เขียนทับเมธอดของคลาสแม่และเรียกใช้ด้วย super()

การเขียนทับเมธอดและ super() เป็นบทเรียน Python Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Python Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Python Academy มีบทเรียนทั้งหมด 4 บทเรียน

บทนำ

การเขียนทับเมธอดทำให้คลาสลูกปรับแต่งพฤติกรรมที่สืบทอดมาได้ ส่วน super() ช่วยให้เรียกใช้การทำงานเดิมได้

พื้นฐานการเขียนทับ

กำหนดเมธอดที่มีชื่อเดียวกันในคลาสลูก เพื่อแทนที่เมธอดของคลาสแม่สำหรับอินสแตนซ์ทั้งหมดของคลาสลูก
class Greeter:
    def greet(self): return 'Hello'
class FormalGreeter(Greeter):
    def greet(self): return 'Good day'
print(FormalGreeter().greet())

super() ในเมธอดที่เขียนทับ

super().greet() ภายในคลาสลูกจะเรียกใช้เวอร์ชันของคลาสแม่ เหมาะสำหรับการต่อยอดพฤติกรรม ไม่ใช่การแทนที่ทั้งหมด
class Logger:
    def log(self, msg): print(f'[LOG] {msg}')
class TimedLogger(Logger):
    def log(self, msg):
        import time
        super().log(f'{time.time():.0f}: {msg}')
TimedLogger().log('test')

super() ใน __init__

ควรเรียกใช้ super().__init__() ใน __init__ ของคลาสลูกเสมอ เพื่อให้แน่ใจว่าการเริ่มต้นของคลาสแม่ทำงาน
class Animal:
    def __init__(self, name): self.name = name
class Cat(Animal):
    def __init__(self, name, indoor):
        super().__init__(name)
        self.indoor = indoor
cat = Cat('Whiskers', True)
print(cat.name, cat.indoor)

super() พร้อมอาร์กิวเมนต์

super(ChildClass, self) เป็นรูปแบบที่ระบุอย่างชัดเจนตามรูปแบบของ Python 2 ส่วน Python 3 อนุญาตให้ใช้ super() โดยไม่ระบุอาร์กิวเมนต์ได้ในกรณีส่วนใหญ่
class A:
    def greet(self): return 'A'
class B(A):
    def greet(self): return super().greet() + 'B'
class C(B):
    def greet(self): return super().greet() + 'C'
print(C().greet())

การสืบทอดแบบทำงานร่วมกัน

ในการสืบทอดหลายชั้น super() จะทำตาม MRO การที่ทุกคลาสเรียกใช้ super() ทำให้แน่ใจว่าคลาสทั้งหมดในสายการสืบทอดได้รับการเริ่มต้น
class A:
    def __init__(self): print('A init')
class B(A):
    def __init__(self): super().__init__(); print('B init')
class C(A):
    def __init__(self): super().__init__(); print('C init')
class D(B, C):
    def __init__(self): super().__init__(); print('D init')
D()

การเขียนทับ __str__

เขียนทับ __str__ ในคลาสลูกเพื่อปรับแต่งวิธีพิมพ์อินสแตนซ์
class Animal:
    def __init__(self, name): self.name = name
    def __str__(self): return f'Animal: {self.name}'
class Dog(Animal):
    def __str__(self): return f'Dog: {self.name}'
print(Dog('Rex'))

รูปแบบเมธอดแม่แบบ

คลาสแม่กำหนดโครงร่างของขั้นตอนวิธี ส่วนคลาสลูกเติมรายละเอียดแต่ละขั้นตอนด้วยการเขียนทับเมธอดที่ระบุ
class DataProcessor:
    def process(self):
        data = self.load()
        return self.transform(data)
    def load(self): return [1,2,3]
    def transform(self, d): return d
class Doubler(DataProcessor):
    def transform(self, d): return [x*2 for x in d]
print(Doubler().process())

การเรียกใช้เมธอดของคลาสพี่น้อง

เมื่อใช้ super() ร่วมกับ MRO ที่ถูกต้อง คุณสามารถเรียกใช้เมธอดของคลาสพี่น้องในการสืบทอดหลายชั้นได้ ซึ่งเรียกว่า super() แบบทำงานร่วมกัน
class A:
    def hello(self): print('A')
class B(A):
    def hello(self): super().hello(); print('B')
class C(A):
    def hello(self): super().hello(); print('C')
class D(B,C):
    def hello(self): super().hello(); print('D')
D().hello()

__init_subclass__

__init_subclass__ จะถูกเรียกทุกครั้งที่มีการสร้างคลาสย่อยจากคลาสนั้น เหมาะสำหรับรูปแบบการลงทะเบียนปลั๊กอิน
class Plugin:
    registry = []
    def __init_subclass__(cls, **kw):
        super().__init_subclass__(**kw)
        Plugin.registry.append(cls)
class A(Plugin): pass
class B(Plugin): pass
print([c.__name__ for c in Plugin.registry])

กรณีที่ไม่ควรเขียนทับ

อย่าเขียนทับหากไม่จำเป็นต้องเปลี่ยนพฤติกรรม การเขียนทับโดยไม่จำเป็นเพิ่มภาระในการบำรุงรักษา ควรใช้การประกอบออบเจ็กต์กับพฤติกรรมที่ไม่เกี่ยวข้องกัน
# Good: only override what's needed
class Dog(Animal):
    def speak(self): return 'Woof'
    # No need to override __init__ if parent's is fine
print('override guidance')

ตรวจสอบอย่างรวดเร็ว

ใน Python 3 super() ที่ไม่มีอาร์กิวเมนต์หมายถึงอะไรเมื่อใช้ภายในเมธอด

ทบทวน

เขียนทับเมธอดด้วยการกำหนดใหม่ในคลาสลูก super().method() เรียกใช้เวอร์ชันของคลาสแม่ super().__init__() เริ่มต้นคลาสแม่ และ super() แบบทำงานร่วมกันจะทำตามลำดับ MRO

เรียนต่อไป

ก้าวหน้าได้ยอดเยี่ยมมาก! เรียนต่อไปเพื่อทำความเข้าใจแนวคิดถัดไปอย่างเชี่ยวชาญ

คำถามที่พบบ่อย

บทเรียน “การเขียนทับเมธอดและ super()” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การเขียนทับเมธอดและ super()” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Python Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Python Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การเขียนทับเมธอดและ super()”

เขียนทับเมธอดของคลาสแม่และเรียกใช้ด้วย super() คุณปฏิบัติ Python Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Python Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Python Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “การเขียนทับเมธอดและ super()” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Python Academy นี้ได้ไหม

ได้ บทเรียน Python Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การสืบทอดแบบเดี่ยว
  2. การเขียนทับเมธอดและ super()
  3. การสืบทอดหลายแบบและ MRO
  4. พหุรูปและการพิมพ์แบบดักไทป์
← กลับไปที่ Python Academy