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构造函数及解构函数介绍
Feb 26 Python
Python基础入门之seed()方法的使用
May 15 Python
Python处理XML格式数据的方法详解
Mar 21 Python
用Python实现KNN分类算法
Dec 22 Python
python逐行读写txt文件的实例讲解
Apr 03 Python
对pandas的层次索引与取值的新方法详解
Nov 06 Python
Pycharm及python安装详细步骤及PyCharm配置整理(推荐)
Jul 31 Python
python求numpy中array按列非零元素的平均值案例
Jun 08 Python
python可以用哪些数据库
Jun 22 Python
Python自动创建Excel并获取内容
Sep 16 Python
python编程实现清理微信重复缓存文件
Nov 01 Python
Python3的进程和线程你了解吗
Mar 16 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生成网页快照 不用COM不用扩展.
2010/02/11 PHP
php 大数据量及海量数据处理算法总结
2011/05/07 PHP
PHP递归复制、移动目录的自定义函数分享
2014/11/18 PHP
smarty实现多级分类的方法
2014/12/05 PHP
laravel 5.4中实现无限级分类的方法示例
2017/07/27 PHP
Jquery Uploadify多文件上传带进度条且传递自己的参数
2013/08/28 Javascript
JavaScript异步加载浅析
2014/12/28 Javascript
Underscore.js常用方法总结
2015/02/28 Javascript
jQuery实现滚动切换的tab选项卡效果代码
2015/08/26 Javascript
JS实现完全语义化的网页选项卡效果代码
2015/09/15 Javascript
JS实现带关闭功能的阿里妈妈网站顶部滑出banner工具条代码
2015/09/17 Javascript
深入浅出ES6之let和const命令
2016/08/25 Javascript
基于bootstrap风格的弹框插件
2016/12/28 Javascript
20行JS代码实现网页刮刮乐效果
2017/06/23 Javascript
微信web端后退强制刷新功能的实现代码
2018/03/04 Javascript
Vue自定义弹窗指令的实现代码
2018/08/13 Javascript
ES7之Async/await的使用详解
2019/03/28 Javascript
[44:39]2014 DOTA2国际邀请赛中国区预选赛 NE VS CNB
2014/05/21 DOTA
Python中的yield浅析
2014/06/16 Python
python rsa 加密解密
2017/03/20 Python
如何在Python中实现goto语句的方法
2019/05/18 Python
python单例模式的多种实现方法
2019/07/26 Python
Python函数式编程实例详解
2020/01/17 Python
Python基于traceback模块获取异常信息
2020/07/23 Python
Django model重写save方法及update踩坑详解
2020/07/27 Python
总结Pyinstaller的坑及终极解决方法(小结)
2020/09/21 Python
python连接mysql数据库并读取数据的实现
2020/09/25 Python
python中的列表和元组区别分析
2020/12/30 Python
html5指南-4.使用Geolocation实现定位功能
2013/01/07 HTML / CSS
中国梦主题教育活动总结
2014/05/05 职场文书
父亲节活动总结
2015/02/12 职场文书
幼儿园教学工作总结2015
2015/05/12 职场文书
考研经验交流会策划书
2015/11/02 职场文书
Vue自定义铃声提示音组件的实现
2022/01/22 Vue.js
深入解析Apache Hudi内核文件标记机制
2022/03/31 Servers
基于redis+lua进行限流的方法
2022/07/23 Redis