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的Flask框架中使用Flask-Migrate扩展迁移数据库的教程
Jun 14 Python
读写json中文ASCII乱码问题的解决方法
Nov 05 Python
Python抓取聚划算商品分析页面获取商品信息并以XML格式保存到本地
Feb 23 Python
python 中的list和array的不同之处及转换问题
Mar 13 Python
python分治法求二维数组局部峰值方法
Apr 03 Python
python 基本数据类型占用内存空间大小的实例
Jun 12 Python
python flask 如何修改默认端口号的方法步骤
Jul 12 Python
对django views中 request, response的常用操作详解
Jul 17 Python
Django ORM 聚合查询和分组查询实现详解
Aug 09 Python
使用pymysql查询数据库,把结果保存为列表并获取指定元素下标实例
May 15 Python
如何在keras中添加自己的优化器(如adam等)
Jun 19 Python
python调用jenkinsAPI构建jenkins,并传递参数的示例
Dec 09 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
如何批量替换相对地址为绝对地址(利用bat批处理实现)
2013/05/27 PHP
解决PHP4.0 和 PHP5.0类构造函数的兼容问题
2013/08/01 PHP
json的键名为数字时的调用方式(示例代码)
2013/11/15 PHP
基于ThinkPHP实现批量删除
2015/12/18 PHP
ThinkPHP路由机制简介
2016/03/23 PHP
Windows 下安装 swoole 图文教程(php)
2017/06/05 PHP
PHP微信开发之微信录音临时转永久存储
2018/01/26 PHP
Yii框架自定义数据库操作组件示例
2019/11/11 PHP
自适应图片大小的弹出窗口
2006/07/27 Javascript
JavaScript 面向对象之命名空间
2010/05/04 Javascript
json的前台操作和后台操作实现代码
2012/01/20 Javascript
基于jQuery实现模拟页面加载进度条
2013/04/01 Javascript
js根据日期判断星座的示例代码
2014/01/23 Javascript
jQuery四种选择器使用及示例
2016/06/05 Javascript
关于ES6的六个小特性(二)
2017/02/20 Javascript
node.js到底要不要加分号浅析
2018/07/11 Javascript
js中async函数结合promise的小案例浅析
2019/04/14 Javascript
微信小程序报错: thirdScriptError的错误问题
2020/06/19 Javascript
VUE实时监听元素距离顶部高度的操作
2020/07/29 Javascript
vue自定义树状结构图的实现方法
2020/10/18 Javascript
Python安装第三方库的3种方法
2015/06/21 Python
python+pyqt实现12306图片验证效果
2017/10/25 Python
Django中反向生成models.py的实例讲解
2018/05/30 Python
python循环定时中断执行某一段程序的实例
2019/06/29 Python
python实现邮件自动发送
2019/08/10 Python
Python 实现训练集、测试集随机划分
2020/01/08 Python
matplotlib教程——强大的python作图工具库
2020/10/15 Python
python3实现名片管理系统(控制台版)
2020/11/29 Python
中国网上药店领导者:1药网
2017/02/16 全球购物
三星英国官网:Samsung英国
2018/09/25 全球购物
用JAVA SOCKET编程,读服务器几个字符,再写入本地显示
2012/11/25 面试题
既然说Ruby中一切都是对象,那么Ruby中类也是对象吗
2013/01/26 面试题
初中新生军训方案
2014/05/13 职场文书
车辆工程专业求职信
2014/06/14 职场文书
工程索赔意向书
2014/08/30 职场文书
综合素质评价思想道德自我评价
2015/03/09 职场文书