Python 类、对象、继承、方法 的一些使用技巧

Python 类、对象、继承、方法 的一些使用技巧

一、类与对象的核心概念

  • __init__ 是构造方法(创建对象时自动执行)
  • self 代表实例对象本身
  • 属性和方法都通过 self 访问
class Person:
    def __init__(self, name, age):  # 构造函数(初始化对象)
        self.name = name
        self.age = age

    def say_hello(self):
        print(f"Hi, I'm {self.name}, {self.age} years old.")

# 创建对象
p = Person("Alice", 25)
p.say_hello()

二、类变量 vs 实例变量

  • 类变量适合存放共享状态
  • 实例变量用于对象独有属性
  • vars(obj) 可以查看对象的属性字典
class Dog:
    species = "Canine"  # 类变量(所有实例共享)

    def __init__(self, name):
        self.name = name  # 实例变量(每个实例独立)

a = Dog("Buddy")
b = Dog("Rocky")

print(a.species, b.species)  # 都是 "Canine"
a.species = "Wolf"           # 只在 a 实例中修改
print(a.species, b.species)  # Wolf, Canine

三、类方法与静态方法(@classmethod / @staticmethod)

区别总结:

类型 第一个参数 访问类变量 访问实例变量 调用方式
普通方法 self Yes Yes 实例调用
类方法 cls Yes No 类或实例调用
静态方法 No No 类或实例调用
class Circle:
    pi = 3.14159

    def __init__(self, r):
        self.r = r

    @classmethod
    def unit_circle(cls):
        return cls(1)

    @staticmethod
    def area(r):
        return 3.14159 * r * r

c1 = Circle(5)
c2 = Circle.unit_circle()     # 调用类方法创建半径为1的圆
print(Circle.area(3))         # 静态方法不依赖实例

四、继承与方法重写

  • super() 用于调用父类方法(推荐用在子类重写中)
  • 子类可以新增方法或属性
  • Python 支持多继承(谨慎使用)
class Animal:
    def speak(self):
        print("Animal sound")

class Dog(Animal):
    def speak(self):
        super().speak()  # 调用父类方法
        print("Woof!")

d = Dog()
d.speak()

# 输出
Animal sound
Woof!

五、多继承与 MRO(方法解析顺序)

MRO(Method Resolution Order)解释:

  • 按「从左到右」顺序搜索方法
  • 避免菱形继承重复调用
  • 可通过 类名.mro() 查看解析顺序
class A:
    def show(self): print("A")

class B(A):
    def show(self): print("B")

class C(A):
    def show(self): print("C")

class D(B, C): pass

d = D()
d.show()
print(D.mro())  # [D, B, C, A, object]

六、属性访问控制(私有变量)

  • __ 开头的变量被“名称改写”(Name Mangling)
  • 实际存储名: _Account__balance
  • 并非真正私有,只是防止误用
class Account:
    def __init__(self, balance):
        self.__balance = balance  # 私有属性

    def deposit(self, amount):
        self.__balance += amount

    def get_balance(self):
        return self.__balance

a = Account(100)
a.deposit(50)
print(a.get_balance())
# print(a.__balance)  # ❌ 无法直接访问

七、属性封装与 @property

  • 让属性像普通变量一样访问,但内部逻辑可控
  • 避免直接暴露内部实现
  • 可添加 setter、deleter 控制写入、删除行为
class Temperature:
    def __init__(self, celsius):
        self._celsius = celsius

    @property
    def fahrenheit(self):
        return self._celsius * 9/5 + 32

    @fahrenheit.setter
    def fahrenheit(self, value):
        self._celsius = (value - 32) * 5/9

t = Temperature(0)
print(t.fahrenheit)  # 32.0
t.fahrenheit = 212
print(t._celsius)    # 100.0

八、特殊方法(魔法方法)

常见魔法方法:

方法 作用
__init__ 初始化对象
__str__ / __repr__ 打印显示
__len__ len() 调用
__add__ / __sub__ / __mul__ 运算符重载
__getitem__ 支持下标访问
__iter__ / __next__ 支持迭代

这些方法让类更「像内建类型」使用:

class Vector:
    def __init__(self, x, y):
        self.x, self.y = x, y

    def __repr__(self):
        return f"Vector({self.x}, {self.y})"

    def __add__(self, other):
        return Vector(self.x + other.x, self.y + other.y)

    def __len__(self):
        return int((self.x**2 + self.y**2) ** 0.5)

v1 = Vector(3, 4)
v2 = Vector(1, 2)
print(v1 + v2)   # Vector(4, 6)
print(len(v1))   # 5

九、抽象类与接口(abc 模块)

  • ABC 是抽象基类
  • @abstractmethod 必须被子类实现
  • 用于定义「统一接口」的规范
from abc import ABC, abstractmethod

class Animal(ABC):
    @abstractmethod
    def make_sound(self):
        pass

class Dog(Animal):
    def make_sound(self):
        print("Woof!")

d = Dog()
d.make_sound()

十、类的高级技巧

1.动态添加属性和方法

class User:
    pass

u = User()
u.name = "Alice"
u.say = lambda: print("Hi")
u.say()

2.自定义元类(MetaClass,少用)

控制类的创建逻辑,用于框架级开发(如 Django ORM)

实战例子:员工系统

from abc import ABC, abstractmethod

class Employee(ABC):
    def __init__(self, name, salary):
        self.name = name
        self.salary = salary

    @abstractmethod
    def get_bonus(self):
        pass

class Developer(Employee):
    def get_bonus(self):
        return self.salary * 0.10

class Manager(Employee):
    def get_bonus(self):
        return self.salary * 0.25

employees = [Developer("Tom", 8000), Manager("Alice", 15000)]
for e in employees:
    print(f"{e.name} bonus: {e.get_bonus()}")

本文章的原文地址
GitHub主页

posted @ 2025-10-23 16:24  星尘的博客  阅读(23)  评论(0)    收藏  举报