关于Python的面相对象编程
2024-09-07 14:01:23
Python 其实不是面向对象的语言,更像是C语言的面向过程编程的语言
但 Python 也支持 class 关键字来实现类的声明与创建
但 Python 的对象更像是 JavaScript 的函数
遇到的问题 #1
-- 正确的代码
class Person:
user_account = None
name = None
days = None
months = None
abnormal_days = 0
total_hours = 0
total_work_overtime = 0
total_late_hours = 0
def __init__(self, user_acount, name):
self.user_account = user_acount
self.name = name
self.days = []
self.months = []
# 增加12个月的month_record 对象
for i in range(1, 13):
self.months.append(date_process.MonthRecord(i))
print(len(self.months))
-- 错误的代码
class Person:
user_account = None
name = None
days = None
months = []
abnormal_days = 0
total_hours = 0
total_work_overtime = 0
total_late_hours = 0
def __init__(self, user_acount, name):
self.user_account = user_acount
self.name = name
self.days = []
# 增加12个月的month_record 对象
for i in range(1, 13):
self.months.append(date_process.MonthRecord(i))
print(len(self.months))
这两段代码的查询在于 months 变量,在正确的代码里,成员变量的定义里写成了 months = None, months = [ ] 写在了 __init__() 函数里面, 而在错误的代码里写成了 months = [ ]。错误的代码产生的影响是什么呢?
-----------
当你创建一个新的 Person 对象 first_person 时候,在开始执行 __init__() 函数的时候(即是运行到
self.user_account = user_acount
这一步的时候),months 的对象是 [ ]
当你创建第二个 Person 对象 secong_person 的时候,第二次执行 __init__() 函数的时候,months 的对象是 first_person.month(),其引用的其实同一块内存区域的值。
这个地方非常的反直觉,造成的后果也非常大,我为了排查这个错误也花了很久的时间。
--------- 一点猜测
只是猜测而已,没有进行过详细的验证
pyhthon 的 class 其实只是一个类似JS的函数对象,这个函数有自己的内存空间,但是实际上类就像一个函数,每一次引用的的时候都是调取的同一块内存区域,所以,Python写类的时候,成员变量的初始化请务必写到 __init__()函数里
---------- 验证图片
first_person:
second_person:
最新文章
- js的Promise学习笔记(1)
- jeecms内容显示条数
- windbg配置问题汇总
- C# Process 类的思考
- 清除div浮动的三种方式
- cocos2d-x游戏开发系列教程-坦克大战游戏之子弹和地图碰撞
- Logistic Regression:银行贷款申请审批实例
- 正则表达式入门+实战(c#实现)
- SQL注入之Sqli-labs系列第三十三关(基于宽字符逃逸注入)
- 偏流角(Draft Angle)在等距螺旋中的作用
- Py中axis理解【转载】
- fiddler 抓包配置
- 常量表达式和constexpr(c++11)
- 20155210 Exp2 后门原理与实践
- LPDMvvmKit 系列之 UITableView 的改造
- linuxbash 父进程 子进程
- C# DbHelperSQL 类,从东软生成器提取而来
- HTML鼠标悬浮显示隐藏 JS方法
- 1.jQuery入口函数
- Caused by: org.apache.ibatis.binding.BindingException: Parameter 'parameter' not found.解决
热门文章
- 苏大文正节点一 ORA-00603 ORA-27504 ORA-27300 ORA-27301 ORA-27302 BUG
- stringstream使用
- IIS网站建立好后如何更改绑定IP或端口号
- 关于VS编译报错,但是错误信息未提示问题解决方案
- Harmony OS 开发避坑指南——DevEco Device Tool 安装配置
- 小伙伴问我:如何搭建Maven私服?我连夜肝了这篇实战文章!!
- 山寨一个Spring的@Component注解
- C++中memset函数的用法
- MySQL基础 :基本知识点大纲
- shell-变量的数值运算符-计算双括号(())的使用