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 相关文章推荐
Pyramid将models.py文件的内容分布到多个文件的方法
Nov 27 Python
跟老齐学Python之有容乃大的list(3)
Sep 15 Python
python opencv实现gif图片分解的示例代码
Dec 13 Python
深入浅析Python 命令行模块 Click
Mar 11 Python
使用pygame编写Flappy bird小游戏
Mar 14 Python
Python小整数对象池和字符串intern实例解析
Mar 21 Python
Django之choices选项和富文本编辑器的使用详解
Apr 01 Python
python利用platform模块获取系统信息
Oct 09 Python
Python爬虫之Selenium实现关闭浏览器
Dec 04 Python
python 检测nginx服务邮件报警的脚本
Dec 31 Python
python 如何在list中找Topk的数值和索引
May 20 Python
linux中nohup和后台运行进程查看及终止
Jun 24 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
WAR3重制版DOTA 5V5初体验
2020/04/09 DOTA
最省空间的计数器
2006/10/09 PHP
PHP取二进制文件头快速判断文件类型的实现代码
2013/08/05 PHP
PHP实现将浏览历史页面网址保存到cookie的方法
2015/01/26 PHP
php生成rss类用法实例
2015/04/14 PHP
phpinfo() 中 Local Value(局部变量)Master Value(主变量) 的区别
2016/02/03 PHP
php获取ip及网址的简单方法(必看)
2017/04/01 PHP
PHP合并两个或多个数组的方法
2019/01/20 PHP
javascript 面向对象全新理练之数据的封装
2009/12/03 Javascript
直接拿来用的页面跳转进度条JS实现
2016/01/06 Javascript
给angular加上动画效遇到的问题总结
2016/02/17 Javascript
js移动焦点到最后位置的简单方法
2016/11/25 Javascript
jQuery动态生成不规则表格(前后端)
2017/02/21 Javascript
Node.js使用Express.Router的方法
2017/11/14 Javascript
微信小程序模板和模块化用法实例分析
2017/11/28 Javascript
jQuery length 和 size()区别总结
2018/04/26 jQuery
JS实现音乐导航特效
2020/01/06 Javascript
Nuxt默认模板、默认布局和自定义错误页面的实现
2020/05/11 Javascript
js实现拖拽与碰撞检测
2020/09/18 Javascript
vue+element UI实现树形表格
2020/12/29 Vue.js
[01:03:51]2018DOTA2亚洲邀请赛 4.7 淘汰赛 VP vs LGD 第三场
2018/04/09 DOTA
Python标准库06之子进程 (subprocess包) 详解
2016/12/07 Python
浅析PEP570新语法: 只接受位置参数
2019/10/15 Python
基于Python实现扑克牌面试题
2019/12/11 Python
Python进行特征提取的示例代码
2020/10/15 Python
Python模拟登录和登录跳转的参考示例
2020/10/30 Python
HTML5之WebGL 3D概述(下)—借助类库开发及框架介绍
2013/01/31 HTML / CSS
HTML5 移动页面自适应手机屏幕四类方法总结
2017/08/17 HTML / CSS
成人大专自我鉴定范文
2013/10/19 职场文书
四年大学生活的个人自我评价
2013/12/11 职场文书
司仪主持词两篇
2014/03/22 职场文书
大学生个人先进事迹材料范文
2014/05/03 职场文书
毕业设计指导教师评语
2014/12/30 职场文书
2015初中教导处工作总结
2015/07/21 职场文书
Android自定义ScrollView实现阻尼回弹
2022/04/01 Java/Android
Mysql 文件配置解析介绍
2022/05/06 MySQL