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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值