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操作gmail实例
Jan 14 Python
Python实现简单状态框架的方法
Mar 19 Python
仅用50行代码实现一个Python编写的计算器的教程
Apr 17 Python
Python中subprocess的简单使用示例
Jul 28 Python
详解Python迭代和迭代器
Mar 28 Python
Python中列表与元组的乘法操作示例
Feb 10 Python
pandas 实现字典转换成DataFrame的方法
Jul 04 Python
python使用pygame框架实现推箱子游戏
Nov 20 Python
python+mysql实现学生信息查询系统
Feb 21 Python
python lambda表达式在sort函数中的使用详解
Aug 28 Python
使用python制作游戏下载进度条的代码(程序说明见注释)
Oct 24 Python
Python模拟登录requests.Session应用详解
Nov 17 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汉字转拼音的示例
2014/02/27 PHP
php数组生成html下拉列表的方法
2015/07/20 PHP
Smarty使用自定义资源的方法
2015/08/08 PHP
Yii2实现让关联字段支持搜索功能的方法
2016/08/10 PHP
PHP构造函数与析构函数用法示例
2016/09/28 PHP
实例讲解PHP表单验证功能
2019/02/15 PHP
JavaScript this 深入理解
2009/07/30 Javascript
javascript 哈希表(hashtable)的简单实现
2010/01/20 Javascript
关注jquery技巧提高jquery技能(前端开发必学)
2015/11/02 Javascript
通过jquery-ui中的sortable来实现拖拽排序的简单实例
2016/05/24 Javascript
JS操作JSON方法总结(推荐)
2016/06/14 Javascript
jQGrid动态填充select下拉框的选项值(动态填充)
2016/11/28 Javascript
微信小程序左右滑动切换页面详解及实例代码
2017/02/28 Javascript
Bootstrap输入框组件使用详解
2017/06/09 Javascript
js实现复制功能(多种方法集合)
2018/01/06 Javascript
教你如何用node连接redis的示例代码
2018/07/12 Javascript
AngularJS实现与后台服务器进行交互的示例讲解
2018/08/13 Javascript
Vue左滑组件slider使用详解
2020/08/21 Javascript
[01:36]极致酷炫!TI9典藏宝瓶+撼地者至宝展示
2019/06/11 DOTA
Python中使用PyHook监听鼠标和键盘事件实例
2014/07/18 Python
Python之str操作方法(详解)
2017/06/19 Python
tensorflow 使用flags定义命令行参数的方法
2018/04/23 Python
python selenium 对浏览器标签页进行关闭和切换的方法
2018/05/21 Python
python清除字符串前后空格函数的方法
2018/10/21 Python
Python scrapy爬取小说代码案例详解
2020/07/09 Python
python判断元素是否存在的实例方法
2020/09/24 Python
Carter’s官方旗舰店:美国受欢迎的婴童服装品牌
2018/01/21 全球购物
怀旧香味蜡烛:Homesick
2019/11/02 全球购物
印度第一网上礼品店:IGP.com
2020/02/06 全球购物
创优争先心得体会
2014/09/11 职场文书
护士工作失误检讨书
2014/09/14 职场文书
大学生实习证明范本
2014/09/19 职场文书
先进典型事迹材料
2014/12/29 职场文书
英语投诉信范文
2015/07/03 职场文书
Python提取PDF指定内容并生成新文件
2021/06/09 Python
TV动画《政宗君的复仇》第二季制作决定PV公布
2022/04/02 日漫