Python 类、对象、继承、方法 的一些使用技巧
一、类与对象的核心概念
__init__
是构造方法(创建对象时自动执行)self
代表实例对象本身- 属性和方法都通过
self
访问
class Person:def __init__(self, name, age): # 构造函数(初始化对象)self.name = nameself.age = agedef 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.14159def __init__(self, r):self.r = r@classmethoddef unit_circle(cls):return cls(1)@staticmethoddef area(r):return 3.14159 * r * rc1 = 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): passd = 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 += amountdef get_balance(self):return self.__balancea = Account(100)
a.deposit(50)
print(a.get_balance())
# print(a.__balance) # ❌ 无法直接访问
七、属性封装与 @property
- 让属性像普通变量一样访问,但内部逻辑可控
- 避免直接暴露内部实现
- 可添加
setter、deleter
控制写入、删除行为
class Temperature:def __init__(self, celsius):self._celsius = celsius@propertydef fahrenheit(self):return self._celsius * 9/5 + 32@fahrenheit.setterdef fahrenheit(self, value):self._celsius = (value - 32) * 5/9t = 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, ydef __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, abstractmethodclass Animal(ABC):@abstractmethoddef make_sound(self):passclass Dog(Animal):def make_sound(self):print("Woof!")d = Dog()
d.make_sound()
十、类的高级技巧
1.动态添加属性和方法
class User:passu = User()
u.name = "Alice"
u.say = lambda: print("Hi")
u.say()
2.自定义元类(MetaClass,少用)
控制类的创建逻辑,用于框架级开发(如 Django ORM)
实战例子:员工系统
from abc import ABC, abstractmethodclass Employee(ABC):def __init__(self, name, salary):self.name = nameself.salary = salary@abstractmethoddef get_bonus(self):passclass Developer(Employee):def get_bonus(self):return self.salary * 0.10class Manager(Employee):def get_bonus(self):return self.salary * 0.25employees = [Developer("Tom", 8000), Manager("Alice", 15000)]
for e in employees:print(f"{e.name} bonus: {e.get_bonus()}")
本文章的原文地址
GitHub主页