类与面向对象

翻译整理自 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)        # 2

7. 类方法与静态方法

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 * 2

8. 迭代器与生成器

实现 __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 i

9. 数据类 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 是多范式语言,支持面向对象、函数式、过程式风格,灵活自由。