Python OOP深入
学习继承和多态 · 难度:高级 · +15XP
Python OOP深入
Python OOP 深入 — 魔术方法、属性装饰器与多态
学习前的准备
打开终端,输入 python 进入交互式解释器。本教程假设你已经掌握了 Python OOP 基础知识(类、实例、继承、self)。
魔术方法(Magic Methods)
魔术方法是以双下划线开头和结尾的特殊方法,让你自定义对象的内置行为。
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __str__(self):
return f"Point({self.x}, {self.y})"
def __eq__(self, other):
return self.x == other.x and self.y == other.y
def __add__(self, other):
return Point(self.x + other.x, self.y + other.y)
def __abs__(self):
return (self.x ** 2 + self.y ** 2) ** 0.5
p1 = Point(1, 2)
p2 = Point(1, 2)
p3 = Point(3, 4)
print(p1) # Point(1, 2) ——调用了 __str__
print(p1 == p2) # True ——调用了 __eq__
print(p1 + p3) # Point(4, 6) ——调用了 __add__
print(abs(Point(3, 4))) # 5.0 ——调用了 __abs__
属性装饰器 @property
@property 让你像访问属性一样调用方法,同时可以做计算和验证。
class Circle:
def __init__(self, radius):
self._radius = radius
@property
def radius(self):
return self._radius
@radius.setter
def radius(self, value):
if value <= 0:
raise ValueError("半径必须为正数")
self._radius = value
@property
def area(self):
return 3.14159 * self._radius ** 2
@property
def diameter(self):
return self._radius * 2
c = Circle(5)
print(c.area) # 78.53975
print(c.diameter) # 10
c.radius = 10 # 使用 setter
print(c.area) # 314.159
多态(Polymorphism)
不同的类可以定义同名方法,调用者不需要知道具体是哪个类。这就是著名的“鸭子类型”。
class Dog:
def speak(self):
return "汪汪!"
class Cat:
def speak(self):
return "喵喵!"
class Duck:
def speak(self):
return "嘎嘎!"
def animal_sound(animal):
print(animal.speak())
animal_sound(Dog()) # 汪汪!
animal_sound(Cat()) # 喵喵!
animal_sound(Duck()) # 嘎嘎!
小结
魔术方法让你的类支持 Python 的内置操作。@property 让你用属性语法实现带逻辑的访问。多态让你写通用的代码,处理不同的对象。这三个特性构成了 Python OOP 的高级工具箱。