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 示例分享---逻辑推理编程解决八皇后
Jul 20 Python
python简单实现获取当前时间
Aug 27 Python
深入浅析python with语句简介
Apr 11 Python
Pandas删除数据的几种情况(小结)
Jun 21 Python
python3 中的字符串(单引号、双引号、三引号)以及字符串与数字的运算
Jul 18 Python
python下PyGame的下载与安装过程及遇到问题
Aug 04 Python
TensorFlow 输出checkpoint 中的变量名与变量值方式
Feb 11 Python
Python Flask异步发送邮件实现方法解析
Aug 01 Python
python邮件中附加文字、html、图片、附件实现方法
Jan 04 Python
python数据抓取3种方法总结
Feb 07 Python
Python爬取某平台短视频的方法
Feb 08 Python
聊聊基于pytorch实现Resnet对本地数据集的训练问题
Mar 25 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
搜索和替换文件或目录的一个好类--很实用
2006/10/09 PHP
Google Voice 短信发送接口PHP开源版(2010.5更新)
2010/07/22 PHP
php array_pop()数组函数将数组最后一个单元弹出(出栈)
2011/07/12 PHP
推荐一款MAC OS X 下php集成开发环境mamp
2014/11/08 PHP
PHP向浏览器输出内容的4个函数总结
2014/11/17 PHP
php面向对象中static静态属性和静态方法的调用
2015/02/08 PHP
php专用数组排序类ArraySortUtil用法实例
2015/04/03 PHP
php版银联支付接口开发简明教程
2016/10/14 PHP
Javascript 闭包引起的IE内存泄露分析
2012/05/23 Javascript
JS实现的简洁二级导航菜单雏形效果
2015/10/13 Javascript
jQuery form插件之formDdata参数校验表单及验证后提交
2016/01/23 Javascript
js+canvas绘制五角星的方法
2016/01/28 Javascript
javascript 四十条常用技巧大全
2016/09/09 Javascript
利用jQuery.Validate异步验证用户名是否存在(推荐)
2016/12/09 Javascript
jQuery.cookie.js实现记录最近浏览过的商品功能示例
2017/01/23 Javascript
nodejs mysql 实现分页的方法
2017/06/06 NodeJs
纯js实现页面返回顶部的动画(超简单)
2017/08/10 Javascript
通过Nodejs搭建网站简单实现注册登录流程
2019/06/14 NodeJs
微信小程序wx.navigateTo中events属性实现页面间通信传值,数据同步
2019/07/13 Javascript
详解Vue 换肤方案验证
2019/08/28 Javascript
JavaScript实现文件下载并重命名代码实例
2019/12/12 Javascript
小程序新版订阅消息模板消息
2019/12/31 Javascript
JavaScript将数组转换为链表的方法
2020/02/16 Javascript
Express 配置HTML页面访问的实现
2020/11/01 Javascript
使用python判断你是青少年还是老年人
2018/11/29 Python
Python基础学习之基本数据结构详解【数字、字符串、列表、元组、集合、字典】
2019/06/18 Python
python 获取等间隔的数组实例
2019/07/04 Python
python怎么判断素数
2020/07/01 Python
PyTorch中的拷贝与就地操作详解
2020/12/09 Python
大学生学年个人总结
2015/02/15 职场文书
超市采购员岗位职责
2015/04/07 职场文书
解约证明模板
2015/06/19 职场文书
青年文明号创建口号大全
2015/12/25 职场文书
css3 实现文字闪烁效果的三种方式示例代码
2021/04/25 HTML / CSS
Java基础-封装和继承
2021/07/02 Java/Android
教你在 Java 中实现 Dijkstra 最短路算法的方法
2022/04/08 Java/Android