Python 里的类和实例是面向对象编程(OOP)的核心,学好它们能让你写出更结构化、可维护的代码。
参考文章:Python 类和实例 | 简单一点学习 easyeasy.me
1. 什么是类和实例?
类(Class)就像一个蓝图,定义了一类东西的属性(数据)和行为(方法)。比如,“狗” 是一个类,描述了狗有哪些特征(比如名字、品种)和行为(比如叫、跑)。实例(Instance)是根据这个蓝图创建的具体对象,比如你家养的狗 “旺财” 就是一个实例。
现实世界的比喻:
- 类 = 汽车的设计图(规定了汽车有轮子、引擎,能跑能刹车)。
- 实例 = 一辆具体的汽车(比如你开的红色特斯拉)。
用代码看个简单例子:
# 定义一个类
class Dog:
def bark(self):
print("汪汪汪!")
# 创建实例
wangcai = Dog()
wangcai.bark() # 输出:汪汪汪!
这里 Dog 是类,wangcai 是实例,bark 是方法。接下来我们一步步展开。
2. 定义一个类
类的基本语法
在 Python 里,定义类用 class 关键字,后面跟类名(通常首字母大写)。类里可以定义属性(数据)和方法(函数)。
class Dog:
# 类属性(共享的)
species = "Canis familiaris"
# 初始化方法
def __init__(self, name, age):
# 实例属性
self.name = name
self.age = age
# 实例方法
def bark(self):
print(f"{self.name} 说:汪汪汪!")
__init__ 和 self 的作用
__init__是类的构造方法,每次创建实例时都会自动调用,用来初始化实例的属性。self是实例自身的引用,Python 自动把调用方法的实例传给self。比如wangcai.bark()里的self就是wangcai。- 实例属性(像
self.name)是每个实例独有的,存在实例里。 - 类属性(像
species)是类本身的,实例共享。
属性(成员变量)
- 实例属性:定义在
__init__里,用self.xxx表示,每个实例有自己的值。 - 类属性:直接定义在类里,所有实例共享。
例子:
# 创建两个实例
wangcai = Dog("旺财", 3)
xiaohei = Dog("小黑", 2)
print(wangcai.name) # 输出:旺财
print(xiaohei.name) # 输出:小黑
print(wangcai.species) # 输出:Canis familiaris
print(xiaohei.species) # 输出:Canis familiaris
3. 创建和使用实例
实例化对象
用类名加括号来创建实例,括号里传入 __init__ 需要的参数(除了 self)。
# 实例化
wangcai = Dog("旺财", 3)
访问和修改实例属性
可以用点号(.)访问或修改实例的属性。
print(wangcai.name) # 输出:旺财
wangcai.age = 4 # 修改年龄
print(wangcai.age) # 输出:4
调用实例方法
实例方法通过实例调用,Python 自动把实例传给 self。
wangcai.bark() # 输出:旺财 说:汪汪汪!
可以给类加更多方法,比如描述狗狗的行为:
class Dog:
def __init__(self, name, age):
self.name = name
self.age = age
def bark(self):
print(f"{self.name} 说:汪汪汪!")
def run(self):
print(f"{self.name} 在跑!")
wangcai = Dog("旺财", 3)
wangcai.run() # 输出:旺财 在跑!
4. 类方法和静态方法
除了实例方法,Python 还支持类方法和静态方法,用装饰器定义。
@classmethod
- 类方法用
@classmethod装饰,第一个参数是类本身(通常叫cls)。 - 适合操作类属性或不需要实例的操作。
class Dog:
species = "Canis familiaris"
@classmethod
def get_species(cls):
return cls.species
print(Dog.get_species()) # 输出:Canis familiaris
@staticmethod
- 静态方法用
@staticmethod装饰,不需要self或cls,就像普通函数,但属于类的命名空间。 - 适合跟类相关的工具函数。
class Dog:
@staticmethod
def dog_years(age):
return age * 7
print(Dog.dog_years(3)) # 输出:21
什么时候用?
- 实例方法:需要访问实例属性或行为时(90% 的情况)。
- 类方法:操作类属性或类相关的逻辑。
- 静态方法:跟类相关但不需要访问类或实例的属性。
5. 继承和多态
类的继承机制
继承让一个类(子类)可以继承另一个类(父类)的属性和方法,复用代码。
class Animal:
def __init__(self, name):
self.name = name
def eat(self):
print(f"{self.name} 在吃东西")
class Dog(Animal): # 继承 Animal
def bark(self):
print(f"{self.name} 说:汪汪汪!")
wangcai = Dog("旺财")
wangcai.eat() # 输出:旺财 在吃东西
wangcai.bark() # 输出:旺财 说:汪汪汪!
方法重写和多态
子类可以重写父类的方法,实现自己的逻辑,这叫多态。
class Cat(Animal):
def eat(self): # 重写 eat 方法
print(f"{self.name} 在优雅地吃鱼")
xiaohua = Cat("小花")
xiaohua.eat() # 输出:小花 在优雅地吃鱼
super() 的用法
用 super() 调用父类的方法,常用在子类的 __init__ 或重写方法中。
class Dog(Animal):
def __init__(self, name, age):
super().__init__(name) # 调用父类的 __init__
self.age = age
def eat(self):
super().eat() # 调用父类的 eat
print(f"{self.name} 吃得很开心!")
wangcai = Dog("旺财", 3)
wangcai.eat()
# 输出:
# 旺财 在吃东西
# 旺财 吃得很开心!
6. 特殊方法(魔法方法)
魔法方法是 Python 里以双下划线开头和结尾的方法(像 __str__),可以自定义对象的行为。
常见的魔法方法
__str__:定义print()时的输出。__repr__:定义对象的“开发者友好”表示,通常用于调试。__len__:定义len()的行为。
例子:
class Dog:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"{self.name},{self.age}岁"
def __repr__(self):
return f"Dog(name='{self.name}', age={self.age})"
wangcai = Dog("旺财", 3)
print(wangcai) # 输出:旺财,3岁
print(repr(wangcai)) # 输出:Dog(name='旺财', age=3)
自定义对象行为
可以用魔法方法让对象支持运算,比如 __add__:
class Dog:
def __init__(self, name, energy):
self.name = name
self.energy = energy
def __add__(self, other):
return self.energy + other.energy
wangcai = Dog("旺财", 10)
xiaohei = Dog("小黑", 20)
print(wangcai + xiaohei) # 输出:30
7. 小结和实践建议
学完后怎么用
- 组织代码:用类把相关的数据和行为打包,代码更清晰。
- 复用代码:通过继承减少重复代码。
- 模块化:把复杂逻辑拆分成类,方便维护。
常见误区和注意事项
- 别忘了
self:实例方法必须显式写self作为第一个参数。 - 类属性 vs 实例属性:类属性是共享的,改了会影响所有实例。
- 继承要谨慎:不要为了继承而继承,确认子类和父类有“是”关系(比如狗是动物)。
- 魔法方法别乱用:只在需要自定义行为时用,比如需要
print好看点才写__str__。
3439

被折叠的 条评论
为什么被折叠?



