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()}")
本文来自博客园作者:星尘的博客,转载请注明出处:https://www.cnblogs.com/yqbaowo/p/19160872

浙公网安备 33010602011771号