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的三目运算符和not in运算符使用示例
Mar 03 Python
Python中encode()方法的使用简介
May 18 Python
python利用OpenCV2实现人脸检测
Apr 16 Python
浅谈Python 列表字典赋值的陷阱
Jan 20 Python
Django重置migrations文件的方法步骤
May 01 Python
Python从函数参数类型引出元组实例分析
May 28 Python
Python 微信爬虫完整实例【单线程与多线程】
Jul 06 Python
对python 中re.sub,replace(),strip()的区别详解
Jul 22 Python
Python实现决策树并且使用Graphviz可视化的例子
Aug 09 Python
tensorflow之变量初始化(tf.Variable)使用详解
Feb 06 Python
详解Python流程控制语句
Oct 28 Python
python statsmodel的使用
Dec 21 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
咖啡与牛奶
2021/03/03 冲泡冲煮
destoon找回管理员密码的方法
2014/06/21 PHP
PHP数据对象PDO操作技巧小结
2016/09/27 PHP
yii2安装详细流程
2018/05/23 PHP
用Javascript同时提交多个Web表单的方法
2009/12/26 Javascript
JavaScript中利用Array和Object实现Map的方法
2015/07/27 Javascript
JS实现弹性菜单效果代码
2015/09/07 Javascript
javaScript实现可缩放的显示区效果代码
2015/10/26 Javascript
Javascript的表单验证长度
2016/03/16 Javascript
Vue数据驱动模拟实现5
2017/01/13 Javascript
jacascript DOM节点——元素节点、属性节点、文本节点
2017/04/18 Javascript
React-Native中props具体使用详解
2017/09/04 Javascript
基于cropper.js封装vue实现在线图片裁剪组件功能
2018/03/01 Javascript
浅谈微信JS-SDK 微信分享接口开发(介绍版)
2018/08/15 Javascript
vue-router beforeEach跳转路由验证用户登录状态
2018/12/26 Javascript
微信小程序实现单列下拉菜单效果
2019/04/25 Javascript
vue 父组件中调用子组件函数的方法
2019/06/06 Javascript
Vue SSR 即时编译技术的实现
2020/05/06 Javascript
python简单猜数游戏实例
2015/07/09 Python
Python给定一个句子倒序输出单词以及字母的方法
2018/12/20 Python
10招!看骨灰级Pythoner玩转Python的方法
2019/04/15 Python
解决pycharm上的jupyter notebook端口被占用问题
2019/12/17 Python
python 异步async库的使用说明
2020/05/04 Python
Django跨域请求原理及实现代码
2020/11/14 Python
HTML5 离线应用之打造零请求、无流量网站的解决方法
2013/04/25 HTML / CSS
Manuka Doctor美国官网:麦卢卡蜂蜜和蜂毒护肤
2016/12/25 全球购物
GLAMGLOW格莱魅美国官网:美国知名的面膜品牌
2016/12/31 全球购物
英国婴儿及儿童产品商店:TigerParrot
2019/03/04 全球购物
物业经理求职自我评价
2013/09/22 职场文书
小学生美德少年事迹
2014/02/02 职场文书
电视节目策划方案
2014/05/16 职场文书
公司新人试用期自我评价
2014/09/17 职场文书
2016新教师培训心得体会范文
2016/01/08 职场文书
企业转让协议书(范文2篇)
2019/08/15 职场文书
css背景和边框标签实例详解
2021/05/21 HTML / CSS
动画电影《龙珠超 超级英雄》延期上映
2022/03/20 日漫