
在python中,类是创建对象的蓝图,而对象是类的实例。类定义了属性(数据)和方法(行为)。属性可以分为两种主要类型:
方法是定义在类中的函数,用于操作对象的属性或执行某些行为。所有实例方法都必须将 self 作为第一个参数,self 指代调用该方法的实例本身。
初学者在定义Python类时,常会将本应属于实例的属性错误地定义为类属性,或者在方法中访问实例属性时遗漏 self 关键字。以下是一个典型的错误示例,它试图创建一个 trader 类来模拟交易行为:
class trader:
action = [] # 错误:这是一个类属性,所有实例共享
number = 0 # 错误:这是一个类属性,所有实例共享
def __init__(self, price):
self.price = price
def takeAction(self):
if self.price < 50:
action.append('BUY') # 错误:未通过 self 访问类属性 action
number += 1 # 错误:number 被视为局部变量
elif self.price > 90:
action.append('SELL') # 错误:未通过 self 访问类属性 action
number = number - 1 # 错误:number 被视为局部变量
else:
action.append('HOLD') # 错误:未通过 self 访问类属性 action
# number 没有任何操作,且仍被视为局部变量
return action # 返回的是类属性 action问题分析:
要解决上述问题,核心在于确保每个实例拥有其独立的属性,并在方法中正确地访问和修改这些实例属性。这通常通过以下两点实现:
立即学习“Python免费学习笔记(深入)”;
下面是修正后的 trader 类代码:
class trader:
def __init__(self, price):
# 将 action 和 number 初始化为实例属性
self.action = [] # 每个 trader 实例拥有独立的 action 列表
self.number = 0 # 每个 trader 实例拥有独立的 number 计数器
self.price = price # 初始化实例的价格
def takeAction(self):
# 在方法中通过 self. 访问和修改实例属性
if self.price < 50:
self.action.append('BUY')
self.number += 1 # 正确修改实例的 number 属性
elif self.price > 90:
self.action.append('SELL')
self.number -= 1 # 正确修改实例的 number 属性
else:
self.action.append('HOLD')
# 'HOLD' 操作不改变 number,此处无需额外代码
# 返回最后一次采取的行动
return self.action[-1]代码解释:
现在,让我们使用修正后的 trader 类来创建实例并验证其行为:
# 创建一个价格为 30 的交易者实例
t1 = trader(30)
print(f"t1 初始持仓数量: {t1.number}") # 输出: t1 初始持仓数量: 0
print(f"t1 初始交易记录: {t1.action}") # 输出: t1 初始交易记录: []
# t1 采取行动 (价格 30 < 50, 应为 'BUY')
action_t1 = t1.takeAction()
print(f"t1 采取的行动: {action_t1}") # 输出: t1 采取的行动: BUY
print(f"t1 更新后持仓数量: {t1.number}") # 输出: t1 更新后持仓数量: 1
print(f"t1 更新后交易记录: {t1.action}") # 输出: t1 更新后交易记录: ['BUY']
# 创建另一个价格为 100 的交易者实例
t2 = trader(100)
print(f"t2 初始持仓数量: {t2.number}") # 输出: t2 初始持仓数量: 0
print(f"t2 初始交易记录: {t2.action}") # 输出: t2 初始交易记录: []
# t2 采取行动 (价格 100 > 90, 应为 'SELL')
action_t2 = t2.takeAction()
print(f"t2 采取的行动: {action_t2}") # 输出: t2 采取的行动: SELL
print(f"t2 更新后持仓数量: {t2.number}") # 输出: t2 更新后持仓数量: -1
print(f"t2 更新后交易记录: {t2.action}") # 输出: t2 更新后交易记录: ['SELL']
# 再次检查 t1 的状态,确保其独立性
print(f"再次检查 t1 的持仓数量: {t1.number}") # 输出: 再次检查 t1 的持仓数量: 1
print(f"再次检查 t1 的交易记录: {t1.action}") # 输出: 再次检查 t1 的交易记录: ['BUY']从输出可以看出,t1 和 t2 两个实例的 action 列表和 number 属性都保持了独立性,各自根据其 price 属性进行了正确的更新。
正确理解和使用Python中的实例属性与类属性是编写健壮、可维护面向对象代码的基础。通过在 __init__ 方法中初始化实例属性,并始终使用 self 关键字来访问和修改这些属性,我们可以确保每个对象实例拥有独立的状态和行为,避免了数据共享带来的潜在问题。遵循这些最佳实践将有助于构建清晰、高效的Python类。
以上就是Python类与对象:深入理解实例属性和方法的正确使用的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号