Python之关于类变量的两种赋值区别详解


Posted in Python onMarch 12, 2020

我就废话不多说了,还是直接看代码吧!

# -*- coding:utf-8 -*-
#面试题,写一个方法,将一行字符串中所有的单词数量统计出来
 
class Person(object):
 TAG = "hello"
 
p1 = Person()
p2 = Person()
 
print p1.TAG #第一种赋值方式
print p2.TAG
print Person.TAG #第二种赋值方式
 
p1.TAG = "damn it"
 
print p1.TAG
print p2.TAG
print Person.TAG

输出结果:可以看到,只有p1的TAG,被赋值成了新的"damn it"

hello
hello
hello
damn it
hello
hello

如何将所有对象引用的类变量都赋值成同一个值呢?

Person.TAG = "damn it"

输出结果:完美解决问题

hello
hello
hello
damn it
damn it
damn it

补充知识:python类,赋值,命名空间

python中的类相当于一个命名空间,object.attr 就是一个向上爬属性的过程

属性:__dict__ , __class__ , __bases__

__dict__: 实例或类或模块的属性 , __class__ 实例对应的类对象,__bases__(元组):父类/超类

爬属性:

def findAttr(obj , attr):
 if attr in obj.__dict__:
  return obj.__dict__[attr]
 cls = obj.__class__
 if attr in cls.__dict__:
  return cls.__dict__[attr]
 for super_cls in cls.__bases__:
  if attr in super_cls.__dict__:
   return super_cls.__dict__[attr]
 return None

爬类:

def classTree(cls,indent):
 print('.'*indent + cls.__name__)
 for super_cls in cls.__bases__:
  classTree(super_cls,indent+4)

赋值方式:

class Test:
 static_var = 1 #类属性相当与C++静态成员变量
 def assign(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
def print_global():
 print(x) #打印全局
def print_local():
 x = 1
 print(x) #本地变量
class A:
 x = 2 #类属性==C++静态成员变量 , print A.x
 def m(self):
  x = 3   #本地变量
  self.x = 4 #对象属性
def change_global():
 global x  #修改全局变量,否则x = 100 ,是增加一个本地变量
 x = 100
def print_enclosing():
 x = 200
 def nested():
  print(x)  #在闭包中引用本地变量
def change_in_enclosing():
 x = 1
 def nested():
  nonlocal x
  x = 2   #在闭包中改变本地变量, 如没有nonlocal x , 在又新增一个本地变量

以上这篇Python之关于类变量的两种赋值区别详解别就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中django学习心得
Dec 06 Python
Python学习小技巧总结
Jun 10 Python
python遍历文件夹找出文件夹后缀为py的文件方法
Oct 21 Python
Python openpyxl 遍历所有sheet 查找特定字符串的方法
Dec 10 Python
Python查找最长不包含重复字符的子字符串算法示例
Feb 13 Python
python实现中文文本分句的例子
Jul 15 Python
python视频按帧截取图片工具
Jul 23 Python
django的model操作汇整详解
Jul 26 Python
python实现身份证实名认证的方法实例
Nov 08 Python
python计算无向图节点度的实例代码
Nov 22 Python
使用Pandas将inf, nan转化成特定的值
Dec 19 Python
Python3开发环境搭建详细教程
Jun 18 Python
浅谈python3 构造函数和析构函数
Mar 12 #Python
Python基于yield遍历多个可迭代对象
Mar 12 #Python
Python通过4种方式实现进程数据通信
Mar 12 #Python
Python多进程编程multiprocessing代码实例
Mar 12 #Python
Python多线程多进程实例对比解析
Mar 12 #Python
Python线程协作threading.Condition实现过程解析
Mar 12 #Python
Python 实现网课实时监控自动签到、打卡功能
Mar 12 #Python
You might like
PHP无敌近乎加密方式!
2010/07/17 PHP
php实现Linux服务器木马排查及加固功能
2014/12/29 PHP
php与c 实现按行读取文件实例代码
2017/01/03 PHP
PHP分页显示的方法分析【附PHP通用分页类】
2018/05/10 PHP
jquery 将disabled的元素置为enabled的三种方法
2009/07/25 Javascript
asp.net下利用js实现返回上一页的实现方法小集
2009/11/24 Javascript
Extjs4中的分页应用结合前后台
2013/12/13 Javascript
JavaScript中的依赖注入详解
2015/03/18 Javascript
JS动态修改表格cellPadding和cellSpacing的方法
2015/03/31 Javascript
javascript框架设计之类工厂
2015/06/23 Javascript
JavaScript实现的Tween算法及缓冲特效实例代码
2015/11/03 Javascript
教你用javascript实现随机标签云效果_附代码
2016/03/16 Javascript
BootStrap 轮播插件(carousel)支持左右手势滑动的方法(三种)
2016/07/07 Javascript
javascript中setAttribute兼容性用法分析
2016/12/12 Javascript
Vue.directive使用注意(小结)
2018/08/31 Javascript
JavaScript遍历数组和对象的元素简单操作示例
2019/07/09 Javascript
Vue Element UI + OSS实现上传文件功能
2019/07/31 Javascript
layer ui插件显示tips时,修改字体颜色的实现方法
2019/09/11 Javascript
js实现全选和全不选功能
2020/07/28 Javascript
[50:15]VP vs Mineski 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
Python 过滤字符串的技巧,map与itertools.imap
2008/09/06 Python
python中print()函数的“,”与java中System.out.print()函数中的“+”功能详解
2017/11/24 Python
JS设计模式之责任链模式实例详解
2018/02/03 Python
PyQt5每天必学之QSplitter实现窗口分隔
2018/04/19 Python
python实现扫描局域网指定网段ip的方法
2019/04/16 Python
使用Python制作表情包实现换脸功能
2019/07/19 Python
Python编程学习之如何判断3个数的大小
2019/08/07 Python
使用python获取邮箱邮件的设置方法
2019/09/20 Python
Numpy中ndim、shape、dtype、astype的用法详解
2020/06/14 Python
python如何对链表操作
2020/10/10 Python
python如何利用paramiko执行服务器命令
2020/11/07 Python
求高于平均分的学生学号及成绩
2016/09/01 面试题
大学毕业生求职自荐信
2014/02/20 职场文书
给孩子的新年寄语
2014/04/08 职场文书
一封真诚的自荐信帮你赢得机会
2019/05/07 职场文书
面试中canvas绘制图片模糊图片问题处理
2022/03/13 Javascript