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的正则表达式re模块的常用方法
Mar 09 Python
python中zip()方法应用实例分析
Apr 16 Python
浅谈Python数据类型判断及列表脚本操作
Nov 04 Python
python通过配置文件共享全局变量的实例
Jan 11 Python
python之当你发现QTimer不能用时的解决方法
Jun 21 Python
python3 自动识别usb连接状态,即对usb重连的判断方法
Jul 03 Python
Python实现图片批量加入水印代码实例
Nov 30 Python
使用pyshp包进行shapefile文件修改的例子
Dec 06 Python
python实现井字棋小游戏
Mar 04 Python
Pytorch 使用 nii数据做输入数据的操作
May 26 Python
Python 日期与时间转换的方法
Aug 01 Python
Python自动化之UnitTest框架实战记录
Sep 08 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
libmysql.dll与php.ini是否真的要拷贝到c:\windows目录下呢
2010/03/15 PHP
关于PHP实现异步操作的研究
2013/02/03 PHP
php实现webservice实例
2014/11/06 PHP
php购物车实现方法
2015/01/03 PHP
CodeIgniter框架验证码类库文件与用法示例
2017/03/18 PHP
封装的原生javascript弹出层代码
2010/09/24 Javascript
select多选 multiple的使用示例
2014/06/16 Javascript
使用angular写一个hello world
2015/01/23 Javascript
javascript实现汉字转拼音代码分享
2015/04/20 Javascript
jquery图片滚动放大代码分享(2)
2015/08/28 Javascript
基于JS代码实现导航条弹出式悬浮菜单
2016/06/17 Javascript
Node.js使用orm2进行update操作时关联字段无法修改的解决方法
2017/06/13 Javascript
使用Vuex解决Vue中的身份验证问题
2018/09/28 Javascript
javascript中一些奇葩的日期换算方法总结
2018/11/14 Javascript
深入Node TCP模块的理解
2019/03/13 Javascript
小程序实现按下录音松开识别语音
2019/11/22 Javascript
JS实现斐波那契数列的五种方式(小结)
2020/09/09 Javascript
[02:42]2014DOTA2国际邀请赛 三冰专访:我会打到Ti20
2014/07/13 DOTA
从零学python系列之数据处理编程实例(一)
2014/05/22 Python
Python比较两个图片相似度的方法
2015/03/13 Python
python使用matplotlib绘制折线图教程
2017/02/08 Python
详解Python使用tensorflow入门指南
2018/02/09 Python
Python标准库笔记struct模块的使用
2018/02/22 Python
python用户评论标签匹配的解决方法
2018/05/31 Python
python 3.7.0 安装配置方法图文教程
2018/08/27 Python
pandas 强制类型转换 df.astype实例
2020/04/09 Python
武汉英思工程科技有限公司–ORACLE面试测试题目
2012/04/30 面试题
工程现场管理求职自荐信
2013/10/02 职场文书
物流合作计划书
2014/01/10 职场文书
愚人节活动策划方案
2014/03/11 职场文书
仓库管理员岗位职责
2014/03/19 职场文书
2015年元旦文艺汇演主持词
2014/03/26 职场文书
工程部文员岗位职责
2015/02/04 职场文书
法制教育主题班会
2015/08/13 职场文书
MySQL之高可用集群部署及故障切换实现
2021/04/22 MySQL
python 使用tkinter与messagebox写界面和弹窗
2022/03/20 Python