在Python中,类(class)是创建对象的蓝图,对象(object)是类的具体实例。理解类中的各种方法(实例方法、类方法、静态方法、属性方法及特殊方法)是掌握面向对象编程的核心。
1. 类与对象的基本定义
classStudent:
"""学生类,包含基本属性和方法"""
# 类属性(所有实例共享)
school = "第一中学"
def__init__(self, name, age):
"""构造方法,创建实例时自动调用"""
self.name = name # 实例属性
self.age = age
self._score = 0# 受保护的属性(约定)
# 实例方法:第一个参数为self,可访问实例属性和方法
defintroduce(self):
returnf"我叫{self.name},今年{self.age}岁。"
# 实例方法修改实例属性
defset_score(self, score):
if0 <= score <= 100:
self._score = score
else:
raise ValueError("分数必须在0-100之间")
2. 实例方法、类方法与静态方法
| | | | |
|---|
| | self | 实例.方法() | |
| @classmethod | cls | 类.方法() | |
| @staticmethod | | 类.方法() | |
classStudent:
school = "第一中学"
def__init__(self, name, age):
self.name = name
self.age = age
# 实例方法
defget_info(self):
returnf"{self.name}, {self.age}岁"
# 类方法(常见于工厂方法或修改类状态)
@classmethod
defchange_school(cls, new_school):
cls.school = new_school
print(f"学校更名为:{cls.school}")
# 静态方法(工具函数,逻辑上属于该类)
@staticmethod
defis_adult(age):
return age >= 18
使用示例:
# 实例方法
stu = Student("小明", 15)
print(stu.get_info()) # 小明, 15岁
# 类方法
Student.change_school("实验中学") # 学校更名为:实验中学
print(Student.school) # 实验中学
# 静态方法
print(Student.is_adult(15)) # False
print(Student.is_adult(20)) # True
3. 属性(@property):将方法伪装成属性
使用 @property 装饰器可以像访问属性一样调用方法,便于实现校验、只读或计算属性。相当于getter方法。
classCircle:
def__init__(self, radius):
self._radius = radius # 私有属性
@property
defradius(self):
"""半径的getter"""
return self._radius
@radius.setter
defradius(self, value):
"""半径的setter,增加校验"""
if value <= 0:
raise ValueError("半径必须为正数")
self._radius = value
@property
defarea(self):
"""只读属性:面积"""
return3.14159 * self._radius ** 2
# 使用
c = Circle(5)
print(c.radius) # 5(像属性一样访问)
c.radius = 10# 触发setter
print(c.area) # 314.159(只读,不能赋值)
4. 常用特殊方法(魔术方法)
| | |
|---|
__init__(self, ...) | | |
__str__(self) | print(实例) | |
__repr__(self) | | |
__len__(self) | len(实例) | |
__add__(self, other) | 实例 + 其他 | |
classVector:
def__init__(self, x, y):
self.x = x
self.y = y
def__str__(self):
returnf"Vector({self.x}, {self.y})"
def__repr__(self):
returnf"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
5. 完整综合示例:银行账户类
classBankAccount:
"""银行账户类,演示多种方法的综合使用"""
bank_name = "Python Bank"# 类属性
account_count = 0# 统计开户总数
def__init__(self, owner, balance=0):
self.owner = owner
self._balance = balance
BankAccount.account_count += 1
self._account_id = BankAccount.account_count
# 实例方法
defdeposit(self, amount):
if amount > 0:
self._balance += amount
print(f"存入{amount}元,余额{self._balance}元")
else:
print("存款金额必须为正数")
defwithdraw(self, amount):
if0 < amount <= self._balance:
self._balance -= amount
print(f"取出{amount}元,余额{self._balance}元")
else:
print("余额不足或金额无效")
# 属性方法:只读余额
@property
defbalance(self):
return self._balance
# 属性方法:可读写账户ID(演示setter)
@property
defaccount_id(self):
return self._account_id
# 类方法:修改银行名称
@classmethod
defrename_bank(cls, new_name):
cls.bank_name = new_name
# 静态方法:利息计算工具
@staticmethod
defcalc_interest(principal, rate, years):
return principal * (1 + rate) ** years
# 特殊方法:打印友好信息
def__str__(self):
returnf"账户[{self.account_id}] 持有人:{self.owner},余额:{self.balance}元"
def__repr__(self):
returnf"BankAccount('{self.owner}', {self.balance})"
# 使用演示
acc1 = BankAccount("张三", 1000)
acc2 = BankAccount("李四")
print(acc1) # 账户[1] 持有人:张三,余额:1000元
acc1.deposit(500) # 存入500元,余额1500元
acc1.withdraw(200) # 取出200元,余额1300元
print(acc1.balance) # 1300(属性方式)
BankAccount.rename_bank("Python Global Bank")
print(BankAccount.bank_name) # Python Global Bank
interest = BankAccount.calc_interest(1000, 0.05, 3)
print(f"1000元存3年,5%利率,本息和:{interest:.2f}") # 1157.63
总结
| |
|---|
| 类与对象 | 类是模板,对象是实例。__init__ 初始化实例属性。 |
| 实例方法 | |
| 类方法 | 操作类属性或创建工厂方法,用 @classmethod,参数 cls。 |
| 静态方法 | 工具函数,逻辑上属于类但无需访问类或实例,用 @staticmethod。 |
| 属性 | @property 将方法变为属性,支持 getter/setter/deleter。 |
| 特殊方法 | 让自定义类支持内置函数(len、str)和运算符(+、-)。 |
掌握这些方法,就能写出清晰、可复用且符合Python惯例的面向对象代码。建议你动手运行以上示例,并尝试添加 __sub__、__eq__ 等更多特殊方法,加深理解。