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:

关于Python的面相对象编程的更多相关文章

  1. python 的面相对象编程--对应c++

    在python的面相对象编程中,我们常常在class中可以看到a(),  _b() ,  __c(), __d()__这样的函数. 由于我是看廖雪峰老师的教程,廖老师为了简单起见,没有引入太多概念,我 ...

  2. 019 python面相对象编程

    一:self的意思 1.说明 self代表类的实例,而非类. 类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self. self 代表的是类的实例 ...

  3. python之面相对象程序设计

    一 面向对象的程序设计的由来 面向对象设计的由来见概述:http://www.cnblogs.com/linhaifeng/articles/6428835.html 面向对象的程序设计:路飞学院版 ...

  4. python之面相对象进阶

    一 isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object) ...

  5. Python 5 面对对象编程

    面向对象编程: 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强...” 面向过程编程 ...

  6. Python 面像对象编程(上)

    一: 对象的概念 "面向对象"的核心是"对象"二字,而对象的精髓在于"整合",什么意思? 所有的程序都是由"数据"与&q ...

  7. 【我要学python】面对对象编程之继承和多态

    class animal(object): def run(): print('animal is running...') class dog(animal): def run(self): pri ...

  8. 面相对象编程 扩充之封装、访问机制、 property

    封装: 封装指的是可以将一堆属性和方法,封装到对象中 ps : 对象就好比一个 “袋子/容器”, 可以存放一堆属性和方法 ps : 存不是目的,目的是为了取,可以通过“对象” d的方式获取属性或方法 ...

  9. PHP面相对象编程-重载、覆盖(重写) 多态、接口

    http://www.ctolib.com/topics-21262.html http://cnn237111.blog.51cto.com/2359144/1284085 http://blog. ...

随机推荐

  1. 1.3Hadoop版本说明

  2. 栈的Java实现-分别使用数组和链表

    栈是非常重要的数据结构,栈具有后进先出的特点. 在JVM内部,每个线程维护一个栈,对于每个方法调用,入栈一个元素,成为栈帧,当方法执行完成后,对应的栈帧出栈. 栈帧中,也包含一个栈,称为操作数栈. 一 ...

  3. 论文阅读笔记: Natural Language Inference over Interaction Space

    这篇文章提出了DIIN(DENSELY INTERACTIVE INFERENCE NETWORK)模型. 是解决NLI(NATURAL LANGUAGE INFERENCE)问题的很好的一种方法. ...

  4. Linux常用字段

    cd 切换路径 vim,vi 打开文档 ls  查看文件信息 chmod 修改文件或目录的权限 useradd 添加用户 cat 查看纯文本文件(少内容) rm 删除文件或目录 mv 剪切文件或文件重 ...

  5. newifi3-D2 openwrt挂载u盘扩容/overlay

    格式化U盘 1.openwrt安装插件 opkg install fdisk swap-utils kmod-usb-storage kmod-fs-ext4 e2fsprogs kmod-usb-o ...

  6. Dell XPS 7590 Hackintosh

    网上主流引导Hackintosh的工具有Chameleon, Clover和OpenCore. 但是随着Hackintosh重要驱动开发团队acidanthera逐渐转向OpenCore,后者显然才是 ...

  7. matlab中imfilter、conv2、imfilter2用法及区别

    来源 :https://blog.csdn.net/u013066730/article/details/56665308(比较详细) https://blog.csdn.net/yuanhuilin ...

  8. 《C++primerplus》第7章练习题

    1.用户不断输入两个数,计算调和平均数,直到其中一个数为0. #include<iostream> using namespace std; double harm_mean(double ...

  9. JavaScript筛选数组

    要求: 从一个数组中,筛选出符合条件的元素,放到新数组中. 有一数组[1, 19, 2, 8, 9, 15, 11, 7, 6, 4, 18, 10],将超过10的元素删除. 代码实现: var ar ...

  10. Eating Peach (peach)

    Description On this day, the little monkey went looking for food. He came to a rectangular peach gar ...