《Effective Python》笔记——第4章 元类及属性
一、用属性取代get和set方法
常规的get和set方法如下:
class OldResistor():
def __init__(self, ohms):
self.__ohms = ohms def get_ohms(self):
return self.__ohms def set_ohms(self, ohms):
self.__ohms = ohms if __name__ == '__main__':
r0 = OldResistor(50e3)
print(r0.get_ohms())
r0.set_ohms(10e3)
print(r0.get_ohms())
@property装饰器getter,和setter方法协同工作
class Resistor():
def __init__(self, ohms):
self.ohms = ohms
self.voltage = 0
self.current = 0 class VolResistor(Resistor):
def __init__(self, ohms):
super().__init__(ohms) # 继承父类的变量
self.__vol = 100 # __开头的变量为内部变量,无法在外部引用 @property # getter设置voltage属性
def voltage(self):
return self.__vol @voltage.setter
def voltage(self, voltage):
self.__vol = voltage
self.current = self.__vol / self.ohms if __name__ == '__main__':
r1 = Resistor(50e3)
r1.ohms = 10e3 # public属性
r1.ohms += 5e3
print(r1.ohms) r2 = VolResistor(10)
print(r2.voltage) # getter属性,不会执行voltage的setter方法,不会更新current属性
print(r2.current)
r2.voltage = 100 # voltage属性赋值时,将会执行voltage的setter方法,更新current属性
print(r2.current)
二、考虑用@property来代替属性重构
pass
三、用描述符来改写需要服用的@property方法
__get__
__set__
四、__getattr__、__getattribute__、__setattr__实现按需生成的属性
pass
五、元类
__new__
pass
《Effective Python》笔记——第4章 元类及属性的更多相关文章
- 【python进阶】详解元类及其应用2
前言 在上一篇文章[python进阶]详解元类及其应用1中,我们提到了关于元类的一些前置知识,介绍了类对象,动态创建类,使用type创建类,这一节我们将继续接着上文来讲~~~ 5.使⽤type创建带有 ...
- python随用随学-元类
python中的一切都是对象 按着我的逻辑走: 首先接受一个公理,「python中的一切都是对象」.不要问为什么,吉大爷(Guido van Rossum,python之父)人当初就是这么设计的,不服 ...
- [Effective JavaScript 笔记]第3章:使用函数--个人总结
前言 这一章把平时会用到,但不会深究的知识点,分开细化地讲解了.里面很多内容在高3等基础内容里,也有很多讲到.但由于本身书籍的篇幅较大,很容易忽视对应的小知识点.这章里的许多小提示都很有帮助,特别是在 ...
- Python学习_13_继承和元类
继承 继承的含义就是子类继承父类的命名空间,子类中可以调用父类的属性和方法,由于命名空间的查找方式,当子类中定义和父类同名属性或者方法时,子类的实例调用的是子类中的属性,而不是父类,这就形成了pyth ...
- 通过 python的 __call__ 函数与元类 实现单例模式
简单一句话,当一个类实现__call__方法时,这个类的实例就会变成可调用对象. 直接上测试代码 class ClassA: def __call__(self, *args, **kwargs): ...
- 【python进阶】详解元类及其应用1
前言 元类在python中是很重要的一部分,我将分两次去讲解元类及其应用,此篇为详解元类及其应用第一篇,下面开始今天的说明~~~ 1. 类也是对象 在⼤多数编程语⾔中,类就是⼀组⽤来描述如何⽣成⼀个对 ...
- 编写高质量的Python代码系列(四)之元类及属性
元类(metaclass)及动态属性(dynamic attribute)都是很强大的Python特性,然后他们也可能导致及其古怪.及其突然的行为.本节讲解这些机制的常见用法,以确保各位程序员写出来的 ...
- python中的单例模式、元类
单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...
- python面试题~反射,元类,单例
1 什么是反射?以及应用场景? test.py def f1(): print('f1') def f2(): print('f2') def f3(): print('f3') def f4(): ...
随机推荐
- Ranger-Sqoop2插件安装
Ranger-Sqoop2插件安装,基于Ranger版本1.0.0,支持Sqoop2版本1.99.7. 1.获取安装包 scp root@10.43.159.11:/home/compile/rang ...
- python 面向对象:封装---对象的属性可以是另一个类创建的对象
# 对象封装:对象的属性可以是另一个类创建的对象 # 案例需求: # 1.士兵许三多有一把AK47 # 2.士兵用枪射击标靶 # 3.枪能装填和发射子弹 class Gun: # 分析: # 枪的属性 ...
- 不用find,怎样递归地给目录设置700,给文件设置600权限?
https://stackoverflow.com/questions/36553701/how-to-set-permissions-recursively-700-for-folders-and- ...
- Node.js 模块之【passport】
什么是passport passport是Nodejs的一个中间键,用于用户名和密码的验证登陆.在项目中我用它来验证后台用户名和密码,但passport更多用在第三方登录,功能强大. 安装与配置 本项 ...
- day 8 求平均数
fun()函数的功能:计算形参x所指数组中N个数的平均值,(这里全部取浮点数) 并输出,在将大于平均值的数放在形参y所指的数组中,在主函数输出. 效果还不错: 还存在需要优化的分析:其实存到y数组中的 ...
- Linux命令(2)--cp拷贝、mv剪切、head、tail追踪、tar归档
文章目录 一.知识回顾 ls cd 二.Linux基本操作(二) 1.cp 拷贝 2.mv 移动(剪切) 3.head 头部 4.tail 追踪(尾部) 5.tar 归档 查看 压缩 解压 总结 一. ...
- Solon Web 开发,十一、国际化
Solon Web 开发 一.开始 二.开发知识准备 三.打包与运行 四.请求上下文 五.数据访问.事务与缓存应用 六.过滤器.处理.拦截器 七.视图模板与Mvc注解 八.校验.及定制与扩展 九.跨域 ...
- 【C++】自定义数据类型
自定义数据类型 标签:c++ 目录 自定义数据类型 一.结构体 定义方法: 特点: 成员访问方式: 初始化: 结构数组 指针和动态内存分配: 结构变量作为函数参数: 二.联合 定义方法: 特点: 举例 ...
- 给自己的网站装上SSL证书
给网站装上SSL证书 前言 主要是因为自己的阿里云快过期了,自己的博客也重新用了一下Halo,重新安装SSL的时候有些地方忘了,所以在此留个记录! 关于SSL 阮一峰<图解图解SSL/TLS协议 ...
- golang中的标准库数据格式
数据格式介绍 是系统中数据交互不可缺少的内容 这里主要介绍JSON.XML.MSGPack JSON json是完全独立于语言的文本格式,是k-v的形式 name:zs 应用场景:前后端交互,系统间数 ...