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语言技巧之三元运算符使用介绍
Mar 04 Python
Python简单检测文本类型的2种方法【基于文件头及cchardet库】
Sep 18 Python
python机器学习之贝叶斯分类
Mar 26 Python
Python爬取数据并写入MySQL数据库的实例
Jun 21 Python
Python3用tkinter和PIL实现看图工具
Jun 21 Python
python调用opencv实现猫脸检测功能
Jan 15 Python
Python字符串的一些操作方法总结
Jun 10 Python
详解Python IO编程
Jul 24 Python
python进度条显示-tqmd模块的实现示例
Aug 23 Python
Python爬虫之爬取哔哩哔哩热门视频排行榜
Apr 28 Python
PyTorch 实现L2正则化以及Dropout的操作
May 27 Python
Python爬虫 简单介绍一下Xpath及使用
Apr 26 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更改目录及子目录下所有的文件后缀的代码
2010/09/24 PHP
php面向对象 字段的声明与使用
2012/06/14 PHP
本地机apache配置基于域名的虚拟主机详解
2013/08/10 PHP
php获取新浪微博数据API实例
2013/11/12 PHP
PHP实现的购物车类实例
2015/06/17 PHP
Laravel给生产环境添加监听事件(SQL日志监听)
2017/06/19 PHP
Laravel 加载第三方类库的方法
2018/04/20 PHP
在IE模态窗口中自由查看HTML源码的方法
2007/03/08 Javascript
开发 Internet Explorer 右键功能表(ContextMenu)
2013/07/03 Javascript
Javascript闭包用法实例分析
2015/01/23 Javascript
最全面的JS倒计时代码
2016/09/17 Javascript
vue项目中做编辑功能传递数据时遇到问题的解决方法
2016/12/19 Javascript
vue插件vue-resource的使用笔记(小结)
2017/08/04 Javascript
js实现本地时间同步功能
2017/08/26 Javascript
Express使用html模板的详细代码
2017/09/18 Javascript
JS实现点击复选框变更DIV显示状态的示例代码
2017/12/18 Javascript
Vue实现数据请求拦截
2019/10/23 Javascript
vue中的mescroll搜索运用及各种填坑处理
2019/10/30 Javascript
javascript如何使用函数random来实现课堂随机点名方法详解
2020/07/28 Javascript
[07:08]2014DOTA2西雅图国际邀请赛 小组赛7月11日TOPPLAY
2014/07/11 DOTA
[03:49]2016完美“圣”典风云人物:AMS专访
2016/12/06 DOTA
[43:03]LGD vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
[08:38]DOTA2-DPC中国联赛 正赛 VG vs Elephant 选手采访
2021/03/11 DOTA
跟老齐学Python之编写类之四再论继承
2014/10/11 Python
机器学习python实战之手写数字识别
2017/11/01 Python
Python开发入门——迭代的基本使用
2020/09/03 Python
通俗易懂了解Python装饰器原理
2020/09/17 Python
python安装及变量名介绍详解
2020/12/12 Python
使用phonegap查找联系人的实现方法
2017/03/31 HTML / CSS
英国最大的美妆产品在线零售商之一:Beauty Bay
2017/09/29 全球购物
运动会入场解说词
2014/02/07 职场文书
民政局副局长民主生活会个人整改措施
2014/10/04 职场文书
法定代表人授权委托书格式
2014/10/14 职场文书
长城导游词400字
2015/01/30 职场文书
绍兴鲁迅故居导游词
2015/02/09 职场文书
MySQL5.7并行复制原理及实现
2021/06/03 MySQL