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

พหุรูปและการพิมพ์แบบดักไทป์

เขียนโค้ดพหุรูปที่ทำงานกับออบเจ็กต์ใด ๆ ที่เข้ากันได้

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

บทนำ

พหุสัณฐานทำให้อ็อบเจ็กต์ต่างชนิดตอบสนองต่ออินเทอร์เฟซเดียวกันได้ การพิมพ์แบบเป็ดหมายความว่า หากอ็อบเจ็กต์มีพฤติกรรมเหมือนเป็ด ก็ถือว่าเป็นเป็ด

พหุสัณฐานคืออะไร

พหุสัณฐานหมายถึง “หลายรูปแบบ” ชื่อเมธอดเดียวกันสามารถทำงานแตกต่างกันบนอ็อบเจ็กต์ต่างชนิดได้ และ Python รองรับแนวคิดนี้อย่างมาก
class Cat:
    def speak(self): return 'Meow'
class Dog:
    def speak(self): return 'Woof'
for animal in [Cat(), Dog()]:
    print(animal.speak())

การพิมพ์แบบเป็ด

Python ไม่จำเป็นต้องมีลำดับชั้นของคลาสเพื่อรองรับพหุสัณฐาน หากอ็อบเจ็กต์มีเมธอดที่ถูกต้อง ก็สามารถใช้งานได้ โดยไม่จำเป็นต้องมีอินเทอร์เฟซ
class Duck:
    def quack(self): return 'Quack'
class Person:
    def quack(self): return 'I am quacking like a duck'
def make_it_quack(duck):
    print(duck.quack())
make_it_quack(Duck())
make_it_quack(Person())

ฟังก์ชันแบบพหุสัณฐาน

len() ใช้ได้กับสตริง รายการ พจนานุกรม และทูเพิล เพราะทั้งหมดมีการใช้งาน __len__ นี่คือพหุสัณฐานที่มีมาในตัว
for obj in ['hello', [1,2,3], {'a':1}]:
    print(type(obj).__name__, len(obj))

การโอเวอร์โหลดตัวดำเนินการ

+ ใช้ได้กับจำนวนเต็ม จำนวนทศนิยม สตริง และรายการ เพราะแต่ละชนิดมีการใช้งาน __add__ แตกต่างกัน
print(1 + 2)        # int addition
print('a' + 'b')    # string concat
print([1] + [2])    # list concat

การพิมพ์แบบเป็ดโดยอิงโพรโทคอล

โพรโทคอลการวนซ้ำ: อ็อบเจ็กต์ใดก็ตามที่มี __iter__ และ __next__ จะใช้งานในลูป for ได้โดยไม่ต้องมีคลาสพื้นฐาน
class Squares:
    def __init__(self, n): self.n,self.i=n,0
    def __iter__(self): return self
    def __next__(self):
        if self.i>=self.n: raise StopIteration
        x=self.i**2; self.i+=1; return x
print(list(Squares(5)))

EAFP กับ LBYL

EAFP (ขออภัยภายหลังได้ง่ายกว่าขออนุญาตล่วงหน้า) ใช้ try/except ส่วน LBYL (ตรวจสอบก่อนลงมือทำ) ใช้ if/hasattr โดยทั่วไป Python จะเน้น EAFP
# LBYL:
if hasattr(obj, 'quack'):
    obj.quack()
# EAFP (Pythonic):
try:
    'hello'.quack()
except AttributeError:
    print('no quack')

isinstance() สำหรับการเลือกการทำงานอย่างปลอดภัย

เมื่อจำเป็นต้องใช้พฤติกรรมเฉพาะตามชนิดข้อมูล isinstance() จะอ่านเข้าใจง่ายกว่าการดักจับ AttributeError
def process(data):
    if isinstance(data, str):
        return data.upper()
    elif isinstance(data, list):
        return [x*2 for x in data]
print(process('hi'))
print(process([1,2,3]))

คลาสฐานนามธรรมในฐานะโพรโทคอล

from abc import ABC, abstractmethod ใช้กำหนดโพรโทคอลอย่างเป็นทางการ คลาสย่อยต้องใช้งานเมธอดนามธรรมให้ครบ
from abc import ABC, abstractmethod
class Drawable(ABC):
    @abstractmethod
    def draw(self): pass
class Circle(Drawable):
    def draw(self): print('O')
Circle().draw()

typing.Protocol (3.8 ขึ้นไป)

class MyProtocol(Protocol): ใช้กำหนดการสืบทอดชนิดข้อมูลเชิงโครงสร้างโดยไม่ต้องใช้ ABC และทำงานร่วมกับ mypy สำหรับการตรวจสอบแบบสถิต
from typing import Protocol
class Quackable(Protocol):
    def quack(self) -> str: ...
def make_quack(x: Quackable) -> str:
    return x.quack()
print('protocol demo')

พหุสัณฐานในการใช้งานจริง

ออกแบบ API ให้รับอ็อบเจ็กต์ใดก็ได้ที่มีอินเทอร์เฟซถูกต้อง วิธีนี้ทำให้โค้ดของคุณขยายความสามารถได้โดยไม่ต้องแก้ไขโค้ดเดิม
class JSONSerializer:
    def serialize(self, obj): import json; return json.dumps(obj)
class XMLSerializer:
    def serialize(self, obj): return f'<data>{obj}</data>'
def export(data, serializer):
    return serializer.serialize(data)
print(export({'x': 1}, JSONSerializer()))

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

การพิมพ์แบบเป็ดใน Python หมายถึงอะไร

ทบทวน

พหุสัณฐาน: อินเทอร์เฟซเดียวกันแต่พฤติกรรมต่างกัน การพิมพ์แบบเป็ด: พฤติกรรมสำคัญกว่าชนิดข้อมูล โพรโทคอลใช้กำหนดอินเทอร์เฟซอย่างไม่เป็นทางการ EAFP (try/except) เป็นแนวทางตามแบบฉบับของ Python

เรียนรู้ต่อไป

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

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

บทเรียน “พหุรูปและการพิมพ์แบบดักไทป์” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “พหุรูปและการพิมพ์แบบดักไทป์”

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

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

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

บทเรียน “พหุรูปและการพิมพ์แบบดักไทป์” ใช้เวลานานแค่ไหน

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

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

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

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

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