Python学习小节1
来源:互联网 发布:mac充电器怎么拆 编辑:程序博客网 时间:2024/05/22 05:16
一. 在方法中更改类变量属性的值是危险的,这样会影响根据这个类定义的所有对象的这一属性。
关于这一句,情况是这样的:
1、对象不能修改类的属性,只能修改自己的,也就是说,修改了之后对同类的其他对象没有影响;
2、动态修改类属性可以用类名.属性 = xxx来进行修改;
3、修改的类属性一般会影响所辖对象的属性,除非对象在此之前对该属性进行过修改。
当类变量属性都是immutable的(比如整数、字符串)时,在方法中更改类变量属性的值是可行的,因为在更改对象属性时,该属性会被复制出一个副本,存放在对象的__dict__中;但如果属性是mutable的话(比如list),在更改属性值时,就不会有新的副本,更改会被所有的对象看到,进而影响根据这个类定义的所有对象的这一属性。
例:
class Human(object):
Age = 0
Name = ['li','zhang']
a = Human()
b = Human()
a.Age += 1
print a.Age
print b.Age
a.Name[0] = 'wang'
print a.Name
print b.Name
print a.__class__.__dict__ #可以通过此方式查看
print a.__class__
输出结果:
1
0
['wang', 'zhang']
['wang', 'zhang']
{'__module__': '__main__', 'Name': ['wang', 'zhang'], 'Age': 0, '__dict__': <attribute '__dict__' of 'Human' objects>, '__weakref__': <attribute '__weakref__' of 'Human' objects>, '__doc__': None}
<class '__main__.Human'>
可以通过下面的方式查看:
print a.__class__.__dict__
print a.__dict__
注意到类和对象中各有一个Age:一个0, 一个1。所以我们在查找a.Age的时候,会先查到对象的__dict__的值,也就是1。
所以,在Python中,为了避免混淆,最好总是区分类属性和对象的属性,使用__init__初始化对象属性值,而不能依赖上述的immutable属性的复制机制。
二. superList([1,2,3])和superList([3,4])应该都是superList这个类的对象,那么[1,2,3][3,4]应该是两个对象分别传入进去的b值才对啊,为什么[1,2,3]是self,而[3,4]是b呢
class superlist(list):
def __sub__(self,b):
a = self[:]
b = b[:]
while len(b) > 0:
element_b = b.pop()
if element_b in a:
a.remove(element_b)
return a
print superlist([1,2,3]) -superlist([3,4])
superList([1,2,3])和superList([3,4])是创建superList对象的,比如
>>> l1 = superList([1, 2, 3])
>>> l2 = superList([3, 4])
并不会调用__sub__方法,并不涉及b
只有在下面减法时,才会调用__sub__
>>> l1 - l2
这时相当于
>>> l1.__sub__(l2)
所以,l1是self, l2是b
>>> l1 - l2的时候为什么是>>> l1.__sub__(l2)呢?
他是怎么将“-”识别为__sub__的呢?这个问题挺深的。这个叫做operator overloading,是由Python解释器完成的。
- Python学习小节1
- 学习小节
- 小节1
- js学习,小节
- spring 学习小节
- java学习小节 一
- event事件学习小节
- Android小白的学习小节(1)
- vector学习小节(一)
- vector学习小节(二)
- 平衡二叉树学习小节
- 汇编语言小节(1)
- JSP小节(1)
- Swing小节1
- AIX笔记小节1
- appwidget应用小节1
- javascript 初学小节 1
- Datapump 小节-1
- 按月查询客户余额报表的步骤和SQL脚本
- 探讨android 导航栏中的recent_app界面
- (使用STL自带的排序功能进行排序7.3.2)POJ 2092 Grandpa is Famous(结构体排序)
- java.lang.OutOfMemoryError: PermGen space及其解决方法
- iOS开发-一些面试算法总结
- Python学习小节1
- 调试没有符号的驱动时如何断在入口点处
- GoAgent原理与实现(二):本地代理的C#试验
- HDU 4418 Time travel (概率,高斯消元)
- Word 2010如何从正文开始设置页码
- 【Android开发那点破事】打开APP加载页面实现
- Send 和 WSASend
- 键盘管理
- 给单选框赋值