python面向对象入门之奇怪的静态变量
2017-11-15 15:19
831 查看
python也是一门面向对象的语言,下面是一个简单的python类demo:
上面的desc属性是一个类属性,现在我们把他变为一个数字型的,进行如下实验:
初看上面,count相当于java种的静态变量,在java中用对象去取这个值或者类名去点出这个值其实都是一样的,但是在python中和java中不同,对象去取和类名去取值是不一样的,看上面count默认是0,当执行p1.count=100,如果在java中那么前面三个打印就是一样的都应该是100,而在python打印出来只有p1的count是100其他都是0,这是因为在python对象和类都是通过dict维护的,如果我们在上面的代码改造下,如下:
添加了几个dict的打印,打印结果如下:
前三个dict结果:
后三个dict结果:
对比下,可以看出最开始类的dict和后面的dict中都有’count’: 0这么一个键值对,而刚开始的时候对象p1没有’count’: 100,当对其赋值之后打印出来显示多了’count’: 100,其实python中对象和类都是用dict的方式记录,刚第一次使用p1.count=100的时候并非是将类中的那个count赋值为100,而是给p1这个对象动态添加了一个成员变量,python中寻找变量也是有一个顺序的,当用对象取一个值的时候,先是从对象自己属性中寻找,如果没有就找类中的,如果类中没有就找父类的。
#!/usr/bin/python # -*- coding: UTF-8 -*- # @Time : 17/11/15 下午2:23 # @Author : lijie # @File : mytest03.py ##面向对象 class People: "人类模板" desc="描述" #构造函数 def __init__(self,name,age): self.name = name self.age = age def showDesc(self): print "class",People.__name__,People.desc def showPeople(self): print "name:",self.name," age:",self.age ##测试 p1 = People("lijie",25) p1.showDesc() p1.showPeople() #动态添加属性 p1.sex = "nan" print p1.sex #动态删除属性 del p1.sex ##同上,获取一个属性 getattr(p1,"age",0) ##动态添加一个属性 setattr(p1,"sex","nv") ##动态删除一个属性 delattr(p1,"sex") ##是否拥有该属性 hasattr(p1,"age") ##类文档 print p1.__doc__ ##类名字 print People.__name__ print People.__module__ print People.__dict__ print People.__bases__
上面的desc属性是一个类属性,现在我们把他变为一个数字型的,进行如下实验:
#!/usr/bin/python # -*- coding: UTF-8 -*- # @Time : 17/11/15 下午2:52 # @Author : lijie # @File : mytest04.py class People: count=0 def __init__(self,name): self.name=name # People.count+=1 p1=People("a") p2=People("b") p1.count=100 print p1.count #100 print p2.count #0 print People.count #0 People.count=200 print p1.count #100 print p2.count #200 print People.count #200
初看上面,count相当于java种的静态变量,在java中用对象去取这个值或者类名去点出这个值其实都是一样的,但是在python中和java中不同,对象去取和类名去取值是不一样的,看上面count默认是0,当执行p1.count=100,如果在java中那么前面三个打印就是一样的都应该是100,而在python打印出来只有p1的count是100其他都是0,这是因为在python对象和类都是通过dict维护的,如果我们在上面的代码改造下,如下:
#!/usr/bin/python # -*- coding: UTF-8 -*- # @Time : 17/11/15 下午2:52 # @Author : lijie # @File : mytest04.py class People: count=0 def __init__(self,name): self.name=name # People.count+=1 p1=People("a") p2=People("b") print People.__dict__ print p1.__dict__ print p2.__dict__ p1.count=100 print p1.count #100 print p2.count #0 print People.count #0 print People.__dict__ print p1.__dict__ print p2.__dict__ People.count=200 print p1.count #100 print p2.count #200 print People.count #200
添加了几个dict的打印,打印结果如下:
前三个dict结果:
{'count': 0, '__module__': '__main__', '__doc__': None, '__init__': <function __init__ at 0x109e1c0c8>} {'name': 'a'} {'name': 'b'}
后三个dict结果:
{'count': 0, '__module__': '__main__', '__doc__': None, '__init__': <function __init__ at 0x109e1c0c8>} {'count': 100, 'name': 'a'} {'name': 'b'}
对比下,可以看出最开始类的dict和后面的dict中都有’count’: 0这么一个键值对,而刚开始的时候对象p1没有’count’: 100,当对其赋值之后打印出来显示多了’count’: 100,其实python中对象和类都是用dict的方式记录,刚第一次使用p1.count=100的时候并非是将类中的那个count赋值为100,而是给p1这个对象动态添加了一个成员变量,python中寻找变量也是有一个顺序的,当用对象取一个值的时候,先是从对象自己属性中寻找,如果没有就找类中的,如果类中没有就找父类的。
相关文章推荐
- Python入门篇之面向对象
- python学习之路-7 模块configparser/xml/shutil/subprocess以及面向对象初级入门
- 【七月Python入门】 第四课面向对象基础
- 大牛级别程序员带小白入门Python,花7天整理最全面向对象教程!
- 神级程序员为了带实习生入门Python花25天整理最全面向对象教程!
- python 面向对象入门 - 之 单元测试
- python-面向对象入门
- python面向对象入门
- python入门(二十八):面向对象之继承
- 大牛级别程序员带小白入门Python,花7天整理最全面向对象教程!
- python入门(二十七):面向对象之封装
- Python面向对象入门
- 神级程序员为了带实习生入门Python花25天整理最全面向对象教程!
- Python学习笔记(四):面向对象、正则表达式(快速入门篇)
- python入门6面向对象高级编程
- PYTHON面向对象入门
- python面向对象入门之getter和setter和私有变量
- python入门(二十九):面向对象之多态
- 《每日一课》Python入门之面向对象高级编程
- 我与python约个会:24. 企业级开发基础5:面向对象特征(封装)