Python之关于类变量的两种赋值区别详解
我就废话不多说了,还是直接看代码吧!
#-*-coding:utf-8-*- #面试题,写一个方法,将一行字符串中所有的单词数量统计出来 classPerson(object): TAG="hello" p1=Person() p2=Person() printp1.TAG#第一种赋值方式 printp2.TAG printPerson.TAG#第二种赋值方式 p1.TAG="damnit" printp1.TAG printp2.TAG printPerson.TAG
输出结果:可以看到,只有p1的TAG,被赋值成了新的"damnit"
hello hello hello damnit hello hello
如何将所有对象引用的类变量都赋值成同一个值呢?
Person.TAG="damnit"
输出结果:完美解决问题
hello hello hello damnit damnit damnit
补充知识:python类,赋值,命名空间
python中的类相当于一个命名空间,object.attr就是一个向上爬属性的过程
属性:__dict__,__class__,__bases__
__dict__:实例或类或模块的属性,__class__实例对应的类对象,__bases__(元组):父类/超类
爬属性:
deffindAttr(obj,attr): ifattrinobj.__dict__: returnobj.__dict__[attr] cls=obj.__class__ ifattrincls.__dict__: returncls.__dict__[attr] forsuper_clsincls.__bases__: ifattrinsuper_cls.__dict__: returnsuper_cls.__dict__[attr] returnNone
爬类:
defclassTree(cls,indent): print('.'*indent+cls.__name__) forsuper_clsincls.__bases__: classTree(super_cls,indent+4)
赋值方式:
classTest: static_var=1#类属性相当与C++静态成员变量 defassign(self): self.x=1#对象属性赋值 t=Test() t.x=2#也可以这样,直接赋值 t.__dict__['x']=3#也可以这样,__dict__是对象空间词典,每个对象一份,类对象/模块也有 Test.add_static_var=5#也可以样新增一个类属性
类方法调用,常用的方式object.method(),在python中扩展Class.method(object),两者相同
Test.assign(t)
print(t.x)
当object.method()时,object被传入method(self)中的第一个参数.Class.method(object)需要手动传入
命名空间:
x=0 defprint_global(): print(x)#打印全局 defprint_local(): x=1 print(x)#本地变量 classA: x=2#类属性==C++静态成员变量,printA.x defm(self): x=3#本地变量 self.x=4#对象属性
defchange_global(): globalx#修改全局变量,否则x=100,是增加一个本地变量 x=100 defprint_enclosing(): x=200 defnested(): print(x)#在闭包中引用本地变量 defchange_in_enclosing(): x=1 defnested(): nonlocalx x=2#在闭包中改变本地变量,如没有nonlocalx,在又新增一个本地变量
以上这篇Python之关于类变量的两种赋值区别详解别就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。