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文件操作之目录遍历实例分析
May 20 Python
Python脚本实现12306火车票查询系统
Sep 30 Python
Python使用win32com实现的模拟浏览器功能示例
Jul 13 Python
python中实现控制小数点位数的方法
Jan 24 Python
在django view中给form传入参数的例子
Jul 19 Python
python将字母转化为数字实例方法
Oct 04 Python
Python修改列表值问题解决方案
Mar 06 Python
jupyter notebook读取/导出文件/图片实例
Apr 16 Python
在keras中model.fit_generator()和model.fit()的区别说明
Jun 17 Python
Django前后端分离csrf token获取方式
Dec 25 Python
Python爬取梨视频的示例
Jan 29 Python
python反编译教程之2048小游戏实例
Mar 03 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下连接ftp实现文件的上传、下载、删除文件实例代码
2010/06/03 PHP
PHP安全防范技巧分享
2011/11/03 PHP
PHP中的Memcache详解
2014/04/05 PHP
Laravel 5框架学习之用户认证
2015/04/09 PHP
YiiFramework入门知识点总结(图文教程)
2015/12/28 PHP
在PHP语言中使用JSON和将json还原成数组的方法
2016/07/19 PHP
PHP加密解密类实例代码
2016/07/20 PHP
php实现微信扫码支付
2017/03/26 PHP
B/S开发中常用javaScript技术与代码
2007/03/09 Javascript
js removeChild 障眼法 可能出现的错误
2009/10/06 Javascript
JS远程获取网页源代码实例
2013/09/05 Javascript
js switch case default 的用法示例介绍
2013/10/23 Javascript
jQuery Select下拉框操作小结(推荐)
2016/07/22 Javascript
Highcharts学习之数据列
2016/08/03 Javascript
AngularJS验证信息框架的封装插件用法【w5cValidator扩展插件】
2016/11/03 Javascript
Bootstrap table简单使用总结
2017/02/15 Javascript
JS简单生成随机数(随机密码)的方法
2017/05/11 Javascript
layui弹出层效果实现代码
2017/05/19 Javascript
简述jQuery Easyui一些用法
2017/08/01 jQuery
微信小程序 本地图片按照屏幕尺寸处理
2017/08/04 Javascript
vue基于Element构建自定义树的示例代码
2017/09/19 Javascript
用vue2.0实现点击选中active其他选项互斥的效果
2018/04/12 Javascript
Vue EventBus自定义组件事件传递
2018/06/25 Javascript
layui默认选中table的CheckBox复选框方法
2019/09/19 Javascript
[04:36]DOTA2国际邀请赛 ti3精彩集锦
2013/08/19 DOTA
修改python plot折线图的坐标轴刻度方法
2018/12/13 Python
在python 中实现运行多条shell命令
2019/01/07 Python
python按照多个条件排序的方法
2019/02/08 Python
详解Python Matplot中文显示完美解决方案
2019/03/07 Python
Python 中list ,set,dict的大规模查找效率对比详解
2019/10/11 Python
python标准库OS模块函数列表与实例全解
2020/03/10 Python
JACK & JONES英国官方网站:欧洲领先的男装生产商
2017/09/27 全球购物
Annoushka英国官网:英国奢侈珠宝品牌
2018/10/20 全球购物
民政局副局长民主生活会个人整改措施
2014/10/04 职场文书
2015年化工厂工作总结
2015/05/04 职场文书
tomcat的catalina.out日志按自定义时间格式进行分割的操作方法
2022/04/02 Servers