Fluent-Python-第19章:动态属性和特性

news/2025/2/15 14:42:50/文章来源:https://www.cnblogs.com/super-zzh/p/18716904

动态属性和特性

特性至关重要的地方在于,特性的存在使得开发者可以非常安全并且确定可行地将公共数据属性作为类的公共接口的一部分开放出来。
——Alex Martelli, Python 贡献者和图书作者

本章内容:

  • 特性(property)
  • 动态属性存取(__getattr____setattr__
  • 对象的动态创建(__new__

特性

Python 特性(property)可以使我们在不改变接口的前提下,使用存取方法修改数据属性。

# property
class A:def __init__(self):self._val = 0@propertydef val(self):return self._val@val.setterdef val(self, val):print('Set val', val)self._val = val@val.deleterdef val(self):print('Val deleted!')a = A()
assert a.val == 0
a.val = 1
assert a.val == 1
del a.val
assert a.val == 1      # del val 只是触发了 deleter 方法,再取值时还会执行 val 的 getter 函数
Set val 1
Val deleted!

动态属性

当访问对象的某个属性时,如果对象没有这个属性,解释器会尝试调用对象的 __attr__ 方法。
但是注意,这个属性名必须是一个合法的标识符。

注:__getattr____getattribute__ 的区别在于,__getattribute__ 在每次访问对象属性时都会触发,而 __getattr__ 只在该对象没有这个属性的时候才会触发。

class B:a = 1def __getattr__(self, attr):print('getattr', attr)return attrdef __getattribute__(self, attr):print('getattribute', attr)return super().__getattribute__(attr)b = B()
print(b.a, b.b)
getattribute a
getattribute b
getattr b
1 b

new 方法

__new__ 方法是类上的一个特殊方法,用于生成一个新对象。
__init__ 不同,__new__ 方法必须要返回一个对象,而 __init__ 则不需要。
调用 A.__new__ 时,返回的对象不一定需要是 A 类的实例。

# 对象构造过程示意
class Foo:# __new__ 是一个特殊方法,所以不需要 @classmethod 装饰器def __new__(cls, arg):if arg is None:return []return super().__new__(cls)   # 用 object.__new__ 生成对象后开始执行 __init__ 函数def __init__(self, arg):print('arg:', arg)self.arg = argdef object_maker(the_class, some_arg):new_object = the_class.__new__(the_class, some_arg)if isinstance(new_object, the_class):the_class.__init__(new_object, some_arg)return new_object # 下述两个语句的作用基本等效
x = Foo('bar')
y = object_maker(Foo, 'bar')
assert x.arg == y.arg == 'bar'
n = Foo(None)
assert n == []
arg bar
arg bar

杂谈

shelve 是 Python 自带的、类 dict 的 KV 数据库,支持持久化存储。

import shelved = shelve.open(filename)  # open -- file may get suffix added by low-level# libraryd[key] = data              # store data at key (overwrites old data if# using an existing key)
data = d[key]              # retrieve a COPY of data at key (raise KeyError# if no such key)
del d[key]                 # delete data stored at key (raises KeyError# if no such key)flag = key in d            # true if the key exists
klist = list(d.keys())     # a list of all existing keys (slow!)# as d was opened WITHOUT writeback=True, beware:
d['xx'] = [0, 1, 2]        # this works as expected, but...
d['xx'].append(3)          # *this doesn't!* -- d['xx'] is STILL [0, 1, 2]!# having opened d without writeback=True, you need to code carefully:
temp = d['xx']             # extracts the copy
temp.append(5)             # mutates the copy
d['xx'] = temp             # stores the copy right back, to persist it# or, d=shelve.open(filename,writeback=True) would let you just code
# d['xx'].append(5) and have it work as expected, BUT it would also
# consume more memory and make the d.close() operation slower.d.close()                  # close it

架子(shelve)上放一堆泡菜(pickle)坛子…没毛病。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/884256.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

lesson-9-a-story-on-cyclic-imports

前言 模块(Module)是我们用来组织 Python 代码的基本单位。很多功能强大的复杂站点,都由成百上千个独立模块共同组成。 虽然模块有着不可替代的用处,但它有时也会给我们带来麻烦。比如,当你接手一个新项目后,刚展开项目目录。第一眼就看到了攀枝错节、难以理解的模块结构…

KUKA库卡机器人KRC5控制器维修全过程

库卡工业机器人作为现代工业中的重要设备,KUKA机械手KRC5控制柜作为其核心部件,对机器人的正常运行起着至关重要的作用。 【一】KUKA机械手KRC5控制柜的结构分析 库卡工业机器人控制柜主要由电源模块、控制模块、驱动模块、传感器模块等组成。这些模块协同工作,确保机器人的…

萌新刚入坑

markdddown学习 标题 三级标题 四级标题 字体 Hello,World! Hello,World! Hello,World! Hello,World! 引用 选择狂神说java,走上人生巅峰 分割线图片超链接 点击跳转到狂神博客 列表A CABC表格名字 性别 生日张三 男 1997.1.1代码 hello public

Retrieval-Augmented Generation

大模型的商业化落地挑战 更好地控制大模型生成:生成优点:内容的多样性、创造性 缺点:存在不可控制的问题检索优点:可控 缺点:内容具有局限性结合两者:检索增强生成(Retrieval-Augmented Generation, RAG) 案例:金融智能客服系统的几种思路专家系统 生成式模型 大模型检索…

沁恒CH32V307EVT-R1开发板使用说明

首先下载官方的资料:CH32V307EVT.ZIP - 南京沁恒微电子股份有限公司 解压后CH32V307EVT\EVT\EXAM里的就是官方的示例代码,CH32V307EVT\EVT\PUB下面的是文档 CH32V307EVT/EVT/PUB/CH32V30x评估板说明书.pdf:是各个开发板的介绍 CH32V307EVT/EVT/PUB/CH32V30xSCH.pdf:是开发板…

YASKAWA机器人NX100控制柜无法启动维修

当YASKAWA机器人NX100控制柜无法启动时,这无疑是一个典型的机器人故障。首先要做的是对故障进行初步的排查。检查电源连接是否正常,是否存在松动或者断电的情况。这可能是最常见的原因,但也容易被忽视。同时,观察控制柜的指示灯状态,如果指示灯完全不亮,可能是电源供应模…

微信小程序ReferenceError:xxx is not defined报错解决办法

我在开发的过程中想要打印adressInfo的数据信息,却发现一直报错,而AppData里显示adressInfo是被成功赋值的。 那么问题就出现在了"console.log(adressInfo)"这条语句中 只需要把"adressInfo"改为"this.data.adressInfo"报错问题就能够成功解决…

蒙德里安的梦想(状态压缩)

1.首先就是每列状态的表示,如果该列有横着的方块就用1,表示否则就用零,一共n行最多有n个一就是2^n-1最少0个一就是0,所以0<=i<n;j表示i位移的个数,i最多n位所以最多位移n-1位来检验i每一位,如果是1就检验cnt来检验是否有连续奇数个0,最后还要再检验一次来检验高位…

原子物理之光电效应

光电效应的原理、实验细节和动态分析普朗克能量子 定义 普朗克认为,带电微粒(高中阶段主要研究电子)辐射或吸收能量的时候,只能辐射或吸收某个最小能量值的整数倍。这个不可再分的最小能量值就叫做能量子。 通常的,我们认为光子也是一种能量子。 能量子大小 公式: \[ε=…

钜泉代理商,HT6453钜泉M4电能专用MCU,集成1M Flash、32位定时器、CAN总线

HT6453微控制器内部集成了:32位ARMCortex-M4F处理器,多个16位和32位的定时器,DMA控制器,SPI通信接口,I2C通信接口,USART/UART通信接口,SDIO接口,CAN总线控制器,外部存储控制器XMC,USB2.0全速设备接口,HICK自动时钟校准ACC,12位ADC,12位DAC和PVM模块等外设。大量的…

项目管理5阶段

目录背景和价值参考资料 背景和价值 项目的生命周期共包括5个部分,因为每个部分都会包含至少两个相对独立又相互联系的过程,所以又称“过程组”​。每个过程组的主要工作如下: 启动:确立项目的合法地位和总体要求(目标)​,宣布项目正式立项(上马)​。 规划:编制项目计…

图解支付账务系统核心设计

在金融科技领域,支付账务系统的设计和实现是构建高效、安全支付平台的关键。本文深入探讨了支付账务系统的核心设计,从账户管理、记账处理到清结算与会计服务,为读者揭示了支付账务系统设计的复杂性和重要性。通过详细的图解和案例分析,文章为支付系统设计提供了宝贵的理论…