Python类和实例的属性机制原理详解


Posted in Python onMarch 21, 2020

实例是具象化的类,它可以作为类访问所有静态绑定到类上的属性,包括类变量与方法,也可以作为实例访问动态绑定到实例上的属性。

实例1:

class A:
  work = list("hello")
  kind = list("world")
  another = 1

  def test1(self):
    print(self.work, self.kind, self.another)
    self.work[0], self.kind [0] = "t", "t"
    self.another += 1
    print(A.work, A.kind, A.another)
if __name__ == "__main__":
  a = A()
  a.test1()

输出结果:

['h', 'e', 'l', 'l', 'o'] ['w', 'o', 'r', 'l', 'd'] 1
['t', 'e', 'l', 'l', 'o'] ['t', 'o', 'r', 'l', 'd'] 1

test1中演示了实例对类变量的访问与修改,从输出结果可以看到,类变量work和kind的列表被修改了,而another的值没有发生变化,说明如果类变量是可变的,那么可以通过实例来对类变量进行修改,如果类变量不可变,那么实例无法修改类变量。

实例2:

class A:
  work = list("hello")
  kind = list("world")
  another = 1

  def test2(self):
    A.work, A.kind = "hello", " world"
    A.another += 2
    print(self.__dict__)
    print(self.work, self.kind, self.another)
    A.test2 = 13
    print(self.test2)
if __name__ == "__main__":
  a = A()
  a.test2()

输出结果:

 {'another': 2}
 hello world 2
 13

test2说明了实例访问类变量与方法的机制,在test1中,已经给实例动态绑定了一个another的属性,值为2(因为有赋值语句)。在self.__dict__中可以看到确实出现了实例属性another。

在使用实例访问属性(变量与方法)时,如果在实例的属性集里没有找到对应的属性,那么就会到类的属性集里找对应的属性。self.work和self.kind和类变量保持一致,说明并没有事先在实例与类变量之间建立引用,而是动态查找的。

class A:
  work = list("hello")
  kind = list("world")
  another = 1

  def test3(self):
    print(self.__dict__)
    self.w, self.k = 0, 1
    print(self.__dict__)
    self.work, self.kind = 4, 4
    print(self.__dict__)
    self.test1 = 12
    print(self.__dict__)
    try:
      self.test1()
    except:
      print("test1 is not a bound method")
if __name__ == "__main__":
  a = A()
  a.test3()

输出结果:

 {'another': 2}
 {'another': 2, 'w': 0, 'k': 1}
 {'another': 2, 'w': 0, 'k': 1, 'work': 4, 'kind': 4}
 {'another': 2, 'w': 0, 'k': 1, 'work': 4, 'kind': 4, 'test1': 12}
 test1 is not a bound method

self.__dict__中保存了动态绑定到实例的变量与方法,只要出现了赋值语句,都是动态绑定属性。如果动态绑定的属性与类的变量或方法同名,在查找过程中就会覆盖类的变量和方法。

总结

1. 动态绑定到实例的属性位于self.__dict__中

2. 出现self.attribute = XXX之类的赋值语句都是在往实例上动态绑定属性

3. 实例查找属性的流程:self.work -> self.__dict__["work"] or cls.work,这是一个动态的过程,实例中的同名属性会覆盖类变量或方法,类变量或方法的修改会实时影响实例查找属性的结果

4. 如果类变量是可修改的,如列表,字典等,可以通过实例来修改类变量,方法是不可修改的,故无法通过实例修改方法

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python下载文件时显示下载进度的方法
Apr 02 Python
使用SAE部署Python运行环境的教程
May 05 Python
Python安装使用命令行交互模块pexpect的基础教程
May 12 Python
一步步教你用python的scrapy编写一个爬虫
Apr 17 Python
Python考拉兹猜想输出序列代码实践
Jul 05 Python
Django-Model数据库操作(增删改查、连表结构)详解
Jul 17 Python
Python中xml和dict格式转换的示例代码
Nov 07 Python
python pygame实现球球大作战
Nov 25 Python
Python线程threading模块用法详解
Feb 26 Python
Python使用type动态创建类操作示例
Feb 29 Python
Python loguru日志库之高效输出控制台日志和日志记录
Mar 07 Python
关于python 跨域处理方式详解
Mar 28 Python
Python生成器常见问题及解决方案
Mar 21 #Python
Python作用域与名字空间原理详解
Mar 21 #Python
Python小整数对象池和字符串intern实例解析
Mar 21 #Python
Python描述符descriptor使用原理解析
Mar 21 #Python
Python如何省略括号方法详解
Mar 21 #Python
Python如何使用bokeh包和geojson数据绘制地图
Mar 21 #Python
Spring Boot中使用IntelliJ IDEA插件EasyCode一键生成代码详细方法
Mar 20 #Python
You might like
PHP通用分页类page.php[仿google分页]
2008/08/31 PHP
PHP SQLite类
2009/05/07 PHP
PHP中限制IP段访问、禁止IP提交表单的代码
2011/04/23 PHP
php生成html文件方法总结
2014/12/01 PHP
Zend Framework教程之Zend_Controller_Plugin插件用法详解
2016/03/07 PHP
php json转换相关知识(小结)
2018/12/21 PHP
广告切换效果(缓动切换)
2009/05/27 Javascript
js操作iframe兼容各种主流浏览器示例代码
2013/07/22 Javascript
js获取form的方法
2015/05/06 Javascript
javascript实现状态栏文字首尾相接循环滚动的方法
2015/07/22 Javascript
js倒计时抢购实例
2015/12/20 Javascript
第八篇Bootstrap下拉菜单实例代码
2016/06/21 Javascript
利用Javascript仿Excel的数据透视分析功能
2016/09/07 Javascript
JavaScript实现form表单的多文件上传
2020/03/27 Javascript
Vue路由 重定向和别名的区别说明
2020/09/09 Javascript
python网络爬虫采集联想词示例
2014/02/11 Python
python远程连接服务器MySQL数据库
2018/07/02 Python
使用EduBlock轻松学习Python编程
2018/10/08 Python
Python基础学习之时间转换函数用法详解
2019/06/18 Python
在python plt图表中文字大小调节的方法
2019/07/08 Python
python输入错误后删除的方法
2019/10/12 Python
利用4行Python代码监测每一行程序的运行时间和空间消耗
2020/04/22 Python
python xlsxwriter模块的使用
2020/12/24 Python
HTML5微信播放全屏问题的解决方法
2017/03/09 HTML / CSS
英国玛莎百货美国官网:Marks & Spencer美国
2018/11/06 全球购物
七年级生物教学反思
2014/01/30 职场文书
医药类个人求职的自我评价
2014/02/12 职场文书
缅怀革命先烈演讲稿
2014/05/14 职场文书
大专学生求职信
2014/07/04 职场文书
低碳日宣传活动总结
2014/07/09 职场文书
学生上课说话检讨书
2014/10/25 职场文书
武侯祠导游词
2015/02/04 职场文书
社区青年志愿者活动总结
2015/05/06 职场文书
党支部半年考察意见
2015/06/01 职场文书
2016公司年会主持词
2015/07/01 职场文书
CSS实现九宫格布局(自适应)的示例代码
2022/02/12 HTML / CSS