python中类和实例如何绑定属性与方法示例详解


Posted in Python onAugust 18, 2017

前言

python类与实例的方法的调用中觉得云里雾里,思考之后将自己的想法记录下,一来加深自己理解,巩固自己记忆,而来帮助一些想要学习python的朋友理解这门抽象的语言,由于Python是动态语言,类以及根据类创建的实例可以任意绑定属性以及方法,下面分别介绍。

1.类绑定属性

类绑定属性可以直接在class中定义属性,这种属性是类属。

class Student(object):
  name = 'Student'

这个属性虽然归类所有,但类的所有实例都可以访问到。

class Student(object):
 name = 'Student'
s = Student() # 创建实例s
print(s.name) # 打印name属性,因为实例并没有name属性,所以会继续查找class的name属性
print(Student.name) # 打印类的name属性
Student
Student

此时如果修改s.name的值,会有如下结果:

s.name = 'xiaoming' # 给实例绑定name属性
print(s.name) # 由于实例属性优先级比类属性高,因此,它会屏蔽掉类的name属性
print(Student.name) # 但是类属性并未消失,用Student.name仍然可以访问
xiaoming
Student

接下来删除s.name属性:

del s.name # 如果删除实例的name属性
print(s.name) # 再次调用s.name,由于实例的name属性没有找到,类的name属性就显示出来了
Student

由此可见相同名称的实例属性将覆盖类属性,删除实例属性后,实例将向上访问到类属性。

2.实例绑定属性

实例绑定属性的方法有两种,一是通过类的self变量,二是直接给实例赋值。

class Student(object):
 def __init__(self, name):
  self.name = name
s = Student('Bob')#方法一 通过类的self变量绑定属性
s.score = 90#方法二 直接赋值

3.类绑定方法

类绑定方法分两种,第一种形如类绑定属性,例程如下:

Class Student(object):
 pass
a=Student()#创建实例

def set_score(self,score):
 self.score=score

Student.set_score=set_score#类绑定方法
a.set_score(99)#调用方法
a.score
99#输出

第二种是使用MethodType给类绑定方法:

Class Student(object):
 pass
a=Student()#创建实例

def set_score(self,score):
 self.score=score

from types import MethodType
Student.set_score = MethodType(set_score, Student)

a.set_score(99)#调用方法
a.score
99#输出

这种方法有一个需要注意的地方,如果继续创建一个实例b:

b=Student()
b.set_score(60)
b.score
a.score
60

会发现a的属性score值也变成60。这里个人的理解是这里的score并不是同上一种方法一样直接绑定在类,而是类似于像列表一样的共享引用的关系,

即实例a和b都引用这个score作为自己的属性,而当其被修改时,所有引用它的实例的对应属性都将一同发生变化。

4.实例绑定方法

第一种通过给类绑定方法,可以使实例调用,如上所示。

第二种是使用MethodType给单个实例绑定方法。

Class Student(object):
 pass
a=Student()#创建实例

def set_score(self,score):
 self.score=score

from types import MethodType
a.set_score = MethodType(set_score, a)

a.set_score(99)#调用方法
a.score
99#输出

注意这种方式只对实例a起作用,如果需要类Studnet的所有实例均可调用,那么直接给类Student绑定方法即可。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
python中列表元素连接方法join用法实例
Apr 07 Python
Django中url的反向查询的方法
Mar 14 Python
一篇文章读懂Python赋值与拷贝
Apr 19 Python
Django中的forms组件实例详解
Nov 08 Python
对Python3 解析html的几种操作方式小结
Feb 16 Python
Python面向对象思想与应用入门教程【类与对象】
Apr 12 Python
在python中将list分段并保存为array类型的方法
Jul 15 Python
Python+AutoIt实现界面工具开发过程详解
Aug 07 Python
Django获取应用下的所有models的例子
Aug 30 Python
python超时重新请求解决方案
Oct 21 Python
Python3实现配置文件差异对比脚本
Nov 18 Python
在pycharm创建scrapy项目的实现步骤
Dec 01 Python
Python实现基于多线程、多用户的FTP服务器与客户端功能完整实例
Aug 18 #Python
对python中return和print的一些理解
Aug 18 #Python
浅析Python中return和finally共同挖的坑
Aug 18 #Python
Python多进程multiprocessing用法实例分析
Aug 18 #Python
利用python求相邻数的方法示例
Aug 18 #Python
Python3.5编程实现修改IIS WEB.CONFIG的方法示例
Aug 18 #Python
Python 中 Virtualenv 和 pip 的简单用法详解
Aug 18 #Python
You might like
比file_get_contents稳定的curl_get_contents分享
2012/01/11 PHP
浅析THINKPHP的addAll支持的最大数据量
2015/02/03 PHP
PHP输出一个等腰三角形的方法
2015/05/12 PHP
ThinkPHP3.2框架自带分页功能实现方法示例
2019/05/13 PHP
PHP接入微信H5支付的方法示例
2019/10/28 PHP
Prototype中dom对象方法汇总
2008/09/17 Javascript
jquery控制listbox中项的移动并排序
2009/11/12 Javascript
C#中TrimStart,TrimEnd,Trim在javascript上的实现
2011/01/17 Javascript
探讨JavaScript中声明全局变量三种方式的异同
2013/12/03 Javascript
JQuery选择器绑定事件及修改内容的方法
2015/01/23 Javascript
深入探究JavaScript中for循环的效率问题及相关优化
2016/03/13 Javascript
Vue-Access-Control 前端用户权限控制解决方案
2017/12/01 Javascript
js自定义trim函数实现删除两端空格功能
2018/02/09 Javascript
微信小程序视图容器(swiper)组件创建轮播图
2020/06/19 Javascript
详解微信图片防盗链“此图片来自微信公众平台 未经允许不得引用”的解决方案
2019/04/04 Javascript
富文本编辑器vue2-editor实现全屏功能
2019/05/26 Javascript
python常用知识梳理(必看篇)
2017/03/23 Python
Python中交换两个元素的实现方法
2018/06/29 Python
django模板加载静态文件的方法步骤
2019/03/01 Python
django url到views参数传递的实例
2019/07/19 Python
Python使用PyQt5/PySide2编写一个极简的音乐播放器功能
2020/02/07 Python
python语音识别指南终极版(有这一篇足矣)
2020/09/09 Python
Python更改pip镜像源的方法示例
2020/12/01 Python
浅析python实现动态规划背包问题
2020/12/31 Python
HTML5中实现拖放效果无须借助javascript
2012/12/26 HTML / CSS
在html5的Canvas上绘制椭圆的几种方法总结
2013/01/07 HTML / CSS
意大利奢侈品购物网站:Deliberti
2019/10/08 全球购物
枚举和一组预处理的#define有什么不同
2016/09/21 面试题
冬季施工防火方案
2014/05/17 职场文书
关于读书的演讲稿800字
2014/08/27 职场文书
2014年银行工作总结范文
2014/11/12 职场文书
2014年安全员工作总结
2014/11/13 职场文书
实践论读书笔记
2015/06/29 职场文书
为什么node.js不适合大型项目
2021/04/28 Javascript
JavaScript流程控制(循环)
2021/12/06 Javascript
Python通过loop.run_in_executor执行同步代码 同步变为异步
2022/04/11 Python