- 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中寻找变量也是有一个顺序的,当用对象取一个值的时候,先是从对象自己属性中寻找,如果没有就找类中的,如果类中没有就找父类的。