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:

最新文章

  1. js的Promise学习笔记(1)
  2. jeecms内容显示条数
  3. windbg配置问题汇总
  4. C# Process 类的思考
  5. 清除div浮动的三种方式
  6. cocos2d-x游戏开发系列教程-坦克大战游戏之子弹和地图碰撞
  7. Logistic Regression:银行贷款申请审批实例
  8. 正则表达式入门+实战(c#实现)
  9. SQL注入之Sqli-labs系列第三十三关(基于宽字符逃逸注入)
  10. 偏流角(Draft Angle)在等距螺旋中的作用
  11. Py中axis理解【转载】
  12. fiddler 抓包配置
  13. 常量表达式和constexpr(c++11)
  14. 20155210 Exp2 后门原理与实践
  15. LPDMvvmKit 系列之 UITableView 的改造
  16. linuxbash 父进程 子进程
  17. C# DbHelperSQL 类,从东软生成器提取而来
  18. HTML鼠标悬浮显示隐藏 JS方法
  19. 1.jQuery入口函数
  20. Caused by: org.apache.ibatis.binding.BindingException: Parameter 'parameter' not found.解决

热门文章

  1. 苏大文正节点一 ORA-00603 ORA-27504 ORA-27300 ORA-27301 ORA-27302 BUG
  2. stringstream使用
  3. IIS网站建立好后如何更改绑定IP或端口号
  4. 关于VS编译报错,但是错误信息未提示问题解决方案
  5. Harmony OS 开发避坑指南——DevEco Device Tool 安装配置
  6. 小伙伴问我:如何搭建Maven私服?我连夜肝了这篇实战文章!!
  7. 山寨一个Spring的@Component注解
  8. C++中memset函数的用法
  9. MySQL基础 :基本知识点大纲
  10. shell-变量的数值运算符-计算双括号(())的使用