Python学习之动态绑定
时间:2021-08-08
本文章向大家介绍Python学习之动态绑定,主要包括Python学习之动态绑定使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
动态语言的灵活性,就是当我们定义一个class,创建class的实例后,可以给该实例绑定任何属性和方法。
动态绑定属性
定义一个Student类
class Student(object): def __init__(self): self
给实例绑定一个属性
# 创建一个实例 s = Student() # 动态给实例绑定属性 s.name = "rissa" print("name:%s" % s.name)
结果
name:rissa
动态绑定方法
需要定义一个函数作为实例方法,然后使用MethodType给实例绑定方法。
from types import MethodType class Student(object): def __init__(self): self # 定义一个函数作为实例方法 def set_score(self, score): self.score = score # 创建一个实例 s = Student() # 给实例动态绑定一个方法 s.set_score = MethodType(set_score, s) s.set_score("99") print("score:%s" % s.score)
结果
score:99
但是,给一个实例绑定的方法,对另一个实例是不起作用的
# 给实例动态绑定一个方法或属性后,对另一个实例不起作用 s2 = Student() s2.set_score("96") print("score:%s" % s2.score)
结果
为了给所有实例都绑定方法,可以给class绑定方法,给class绑定方法后,所有实例均可调用。
class Student(object): def __init__(self): self # 定义一个函数作为实例方法 def set_score(self, score): self.score = score # 给class绑定方法 Student.set_score = set_score # 创建实例 s = Student() s2 = Student() s.set_score("98") print("实例s:%s" % s.score) s2.set_score("96") print("实例s2:%s" % s2.score)
实例s:98
实例s2:96
使用__slots__
当给实例动态绑定属性时,想要限制属性,使用__slots__变量来限制添加的属性。
class Student(object): def __init__(self): self __slots__ = ("name", "score") # 以元组的方式 # 创建一个实例 s = Student() # 动态给实例绑定属性 s.name = "rissa" print("name:%s" % s.name) s.score = "95" print("score:%s" % s.score) s.age = 18 print("age:%s" % s.age)
结果
由于“age”没有被放到__slots__中,所以绑定错误。
使用__slots__注意,__slots__定义的属性只对当前类实例有效,对继承的字类的实例是无用的,除非在子类中也定义__slots__。
使用@property
在绑定属性时,我们直接把属性暴露出去,没办法检查参数,导致可以把属性会被随便更改。
我们可以使用setter和getter方法,在setter方法里面限制参数。
class Student(object): def get_score(self): return self._score def set_score(self, value): if not isinstance(value, int): raise ValueError('score must be an integer!') if value < 0 or value > 100: raise ValueError('score must between 0~100!') self._score = value s = Student() s.set_score(100) print("score:", s.get_score())
结果
score: 100
上述是调用方法的形式来访问类的变量,那么有没有既能检查参数,又可以用类似属性这样简单的方式来访问类的变量呢?需要使用Python内置的装饰器@property
负责把一个方法变成属性调用。
class Student(object): @property def score(self): return self._score @score.setter def score(self, value): if not isinstance(value, int): raise ValueError('score must be an integer!') if value < 0 or value > 100: raise ValueError('score must between 0~100!') self._score = value s = Student() s.score = 99 # 实际上转换成了set_score print("score:", s.score) # 实际上转换成了get_score
结果
score: 99
@property把一个getter方法变成了属性,然后又创建了另一个装饰器@score.setter负责把一个setter方法变成属性赋值
原文地址:https://www.cnblogs.com/rissa/p/15116393.html
- Html 5 video/audio 格式转换 ogg
- ASP.NET MVC 开源项目Kigg解读(1)
- 一个setInterval的小问题
- scrollLeft等属性介绍
- ASP.NET MVC 开源项目Kigg解读(2)——Kigg.Core第一部分
- JavaScript 实现接口 (Interfaces In JavaScript)
- JavaScript 中的单例模式 (singleton in Javascript)
- asp.net MVC 权限设计
- Mediawiki 生成google sitemap
- Meidawiki 配置
- 利用JavaScript获取浏览器计算后的样式
- 机器学习算法-决策树C4.5练习
- cssText的基本使用
- jQuery Mobile 教程 (1)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- android如何获取联系人所有信息
- Android条目拖拽删除功能实例代码
- Android Button点击事件的四种实现方法
- Android的App启动时白屏的问题解决办法
- Android获取本机各种类型文件的方法
- Android保存联系人到通讯录的方法
- Android学习之本地广播使用方法详解
- Android编程获取图片数据的方法详解
- Android垂直滚动控件ScrollView使用方法详解
- Android开发之自定义view实现通讯录列表A~Z字母提示效果【附demo源码下载】
- Android ExpandableRecyclerView使用方法详解
- Android开发之SD卡文件操作分析
- Android学习之Broadcast的简单使用
- Android 仿微信自定义数字键盘的实现代码
- RN在Android打包发布App(详解)