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 相关文章推荐
Win7上搭建Cocos2d-x 3.1.1开发环境
Jul 03 Python
浅谈python中set使用
Jun 30 Python
python+django加载静态网页模板解析
Dec 12 Python
python使用turtle绘制分形树
Jun 22 Python
浅谈Python接口对json串的处理方法
Dec 19 Python
GitHub 热门:Python 算法大全,Star 超过 2 万
Apr 29 Python
pyqt5 实现在别的窗口弹出进度条
Jun 18 Python
python读取大文件越来越慢的原因与解决
Aug 08 Python
关于Tensorflow使用CPU报错的解决方式
Feb 05 Python
Windows10+anacond+GPU+pytorch安装详细过程
Mar 24 Python
基于pytorch中的Sequential用法说明
Jun 24 Python
Python 中random 库的详细使用
Jun 03 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
全国FM电台频率大全 - 9 上海市
2020/03/11 无线电
PHP Opcache安装和配置方法介绍
2015/05/28 PHP
非常实用的php验证码类
2016/05/15 PHP
PHP开发APP端微信支付功能
2017/02/17 PHP
几个常用的JavaScript字符串处理函数 - split()、join()、substring()和indexOf()
2009/06/02 Javascript
javascript 三种编解码方式
2010/02/01 Javascript
jQuery实现html表格动态添加新行的方法
2015/05/28 Javascript
javascript中Array()数组函数详解
2015/08/23 Javascript
JQuery ztree 异步加载实例讲解
2016/02/25 Javascript
JS取模、取商及取整运算方法示例
2016/10/13 Javascript
微信小程序 获取微信OpenId详解及实例代码
2016/10/31 Javascript
JS中判断null的方法分析
2016/11/21 Javascript
jQuery点击弹出层弹出模态框点击模态框消失代码分享
2017/01/21 Javascript
Vue中img的src属性绑定与static文件夹实例
2017/05/18 Javascript
性能优化篇之Webpack构建速度优化的建议
2019/04/03 Javascript
vue项目中实现缓存的最佳方案详解
2019/07/11 Javascript
vue ssr服务端渲染(小白解惑)
2019/11/10 Javascript
JavaScript实现打砖块游戏
2020/02/25 Javascript
Vue实现todo应用的示例
2021/02/20 Vue.js
Python中的字符串替换操作示例
2016/06/27 Python
Python调用系统底层API播放wav文件的方法
2017/08/11 Python
python 实现语音聊天机器人的示例代码
2018/12/02 Python
python爬虫之爬取百度音乐的实现方法
2019/08/24 Python
Django项目创建到启动详解(最全最详细)
2019/09/07 Python
django 文件上传功能的相关实例代码(简单易懂)
2020/01/22 Python
简单了解Python write writelines区别
2020/02/27 Python
keras 多gpu并行运行案例
2020/06/10 Python
CSS图片翻转动画技术详解(IE也实现了)
2014/04/03 HTML / CSS
CK美国官网:Calvin Klein
2016/08/26 全球购物
香港中原电器网上商店:Chung Yuen
2019/06/26 全球购物
网络体系结构及协议的定义
2014/03/13 面试题
人力资源管理专业学生自我评价
2013/11/20 职场文书
机械设计及其自动化专业求职信
2014/06/09 职场文书
法人授权委托书样本
2014/09/19 职场文书
《学会看病》教学反思
2016/02/17 职场文书
idea 在springboot中使用lombok插件的方法
2021/08/02 Java/Android