为什么需要类
把"数据 + 操作数据的函数"打包在一起:
# 没用类:散装
def make_player(name, hp):
return {"name": name, "hp": hp}
def take_damage(player, dmg):
player["hp"] -= dmg
p = make_player("WadeLy", 100)
take_damage(p, 30)
# 用类:紧凑
class Player:
def __init__(self, name, hp):
self.name = name
self.hp = hp
def take_damage(self, dmg):
self.hp -= dmg
p = Player("WadeLy", 100)
p.take_damage(30)
三个关键字
- class:定义类
- __init__:构造函数,创建对象时自动调用
- self:当前对象自身的引用(C++/Java 的 this)
完整例子
class Player:
def __init__(self, name, hp=100):
self.name = name # 实例属性
self.hp = hp
self.alive = True
def take_damage(self, dmg):
self.hp -= dmg
if self.hp <= 0:
self.alive = False
print(f"{self.name} 倒下了")
def heal(self, amount):
if self.alive:
self.hp = min(100, self.hp + amount)
def __str__(self): # 决定 print(p) 显示什么
return f"<Player {self.name} HP={self.hp}>"
p = Player("WadeLy")
print(p) # <Player WadeLy HP=100>
p.take_damage(30)
p.heal(10)
print(p.hp) # 80
实例属性 vs 类属性
class Player:
max_hp = 100 # 类属性(所有实例共享)
def __init__(self, name):
self.name = name # 实例属性(每个对象独立)
self.hp = self.max_hp
a = Player("A")
b = Player("B")
a.hp = 50
print(b.hp) # 100,互不影响
类方法 vs 静态方法
class Player:
count = 0
def __init__(self, name):
self.name = name
Player.count += 1
@classmethod
def total(cls): # 类方法,第一个参数是 cls
return cls.count
@staticmethod
def is_valid_name(s): # 静态方法,无 self/cls
return len(s) > 0
Player("A")
Player("B")
print(Player.total()) # 2
print(Player.is_valid_name("")) # False
私有属性约定
Python 没有真正的 private,靠命名约定:
class Player:
def __init__(self, name):
self.name = name # 公开
self._hp = 100 # 单下划线 = "内部用,别动"
self.__secret = 42 # 双下划线 = 名称改写(避免子类冲突)
下一步
下一篇是实战:命令行 Todo 工具——把基础课程的所有知识综合起来。继承、魔术方法这些进阶话题留给「Python 高级教程」。