您的位置:首页 > 编程语言 > Python开发

python面向对象入门之奇怪的静态变量

2017-11-15 15:19 831 查看
python也是一门面向对象的语言,下面是一个简单的python类demo:

#!/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中寻找变量也是有一个顺序的,当用对象取一个值的时候,先是从对象自己属性中寻找,如果没有就找类中的,如果类中没有就找父类的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: