类与面向对象
翻译整理自 Python Tutorial - Classes 与 Data Model。
1. 类与对象
class Dog:
"""A simple dog class."""
kind = "canine" # 类变量,所有实例共享
def __init__(self, name):
self.name = name # 实例变量
def bark(self):
print(f"{self.name}: Woof!")
d = Dog("Rex")
d.bark() # Rex: Woof!2. 实例与类变量
class Dog:
tricks = [] # 类变量(共享)
def __init__(self, name):
self.name = name
d1 = Dog("A"); d2 = Dog("B")
d1.tricks.append("sit")
print(d2.tricks) # ['sit'] ← 共享陷阱!正确写法:
class Dog:
def __init__(self, name):
self.name = name
self.tricks = [] # 实例变量3. 继承
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
raise NotImplementedError
class Cat(Animal):
def speak(self):
return f"{self.name}: Meow"
class Dog(Animal):
def speak(self):
return f"{self.name}: Woof"调用父类方法:
super().__init__(...)
4. 方法重写与 super
class Vehicle:
def start(self):
print("vehicle start")
class Car(Vehicle):
def start(self):
super().start() # 调用父类
print("car start")
Car().start()5. 多重继承
class A: pass
class B: pass
class C(A, B): pass
print(C.__mro__) # 方法解析顺序多重继承要小心菱形继承,建议用 Mixin 模式。
6. 特殊方法(魔术方法)
class Vector:
def __init__(self, x, y):
self.x, self.y = x, y
def __repr__(self):
return f"Vector({self.x}, {self.y})"
def __eq__(self, other):
return self.x == other.x and self.y == other.y
def __add__(self, other):
return Vector(self.x + other.x, self.y + other.y)
def __len__(self):
return 2
def __getitem__(self, i):
return (self.x, self.y)[i]
v1 = Vector(1, 2)
v2 = Vector(3, 4)
v1 + v2 # Vector(4, 6)
len(v1) # 27. 类方法与静态方法
class Counter:
count = 0
@classmethod
def show_count(cls):
return cls.count
@staticmethod
def help():
return "Counter counts things"
@property
def doubled(self):
return self.count * 28. 迭代器与生成器
实现 __iter__ 与 __next__:
class Counter:
def __init__(self, n):
self.i, self.n = 0, n
def __iter__(self):
return self
def __next__(self):
if self.i >= self.n:
raise StopIteration
self.i += 1
return self.i
list(Counter(3)) # [1, 2, 3]生成器是简化版迭代器:
def counter(n):
for i in range(1, n + 1):
yield i9. 数据类 dataclass(3.7+)
from dataclasses import dataclass
@dataclass
class Point:
x: int
y: int
p = Point(1, 2)
print(p) # Point(x=1, y=2)自动生成 __init__、__repr__、__eq__,也可开启 frozen=True 让其不可变。
10. 封装约定
name:公开_name:约定私有__name:触发名称改写(_ClassName__name),不易被外部直接访问__name__:系统保留的特殊方法
小结
Python 是多范式语言,支持面向对象、函数式、过程式风格,灵活自由。