在阅读有些Python的开源项目源码时,会看到某些对象调用了一个方法,但在该对象当中却又找不到该方法。还可能会看到在调用某个方法是并不是直接调用而是使用了getattr这个方法;好在现在IDE比较智能,通常也还能够关联找得到该方法;
调用对象本身没有存在的方法属性、间接调用方法,下面看看在Python中这是怎么回事;
在Python中有不少内置函数,上面所说的功能正是通过它的内置看书实现的:使用了这么几个内置函数:setattr、getattr、hasattr函数;
setattr函数
字面意思,设置属性值,它的真实作业也只是设置函数值;但它可以给某个对象设置一个他不存在的属性并且赋值;
class Ten:
def __init__(self, data):
print("init")
def register(name, fn):
setattr(Ten, name, fn)
上面定义了一个类,该类并没有属性或除了init方法外其他的方法;定义一个register方法,该方法用于向Ten类中注册属性、方法;
t = Ten()
调用register方法,注册属性val,值为5;
register("val", 5)
print(t.val)
打印输出注册的属性val值:5;
定义一个新类:Ops
class Ops:
@staticmethod
def add(x, y):
return x + y
在Ten类中注册ops属性,值为刚定义的类Ops;
register("ops", Ops)
value= t.ops.add(1, 2)
print(value)
此时可以通过注册的属性ops调用该属性的方法;
getattr、hasattr函数
getattr函数用于获取属性、hasattr用于检测某个属性是否存在;
value = getattr(t, "val")
print(value)
获取上面注册的属性val,输出值为5;
获取不存在的属性会抛出异常,此时可使用hasattr函数用于判断属性是否存在,再做下一步处理;
hasattr(t,"mul")
返回False
hasattr(t,”va”)
返回True

了解了这几个函数,看到图中这种代码就可以秒懂了。
FEATURED TAGS
Agent
大模型
ChatGPT
HA
智能家居
LSM
Linux
Dapr
开发
插件
Linux,虚拟机,ubuntu
缓存
图片
Flink
反射
内置函数
go
限流
大数据,Spark,Kafka
面向对象
镜像
docker,hadoop,镜像
kafka,java
求导
链式法则
微积分
源码
快照
协议
ZooKeeper
ZAB
tomcat
Hadoop
Spark
python
自动微分
React Native
React
Node.js
Android
Kafka
lambda
jvm
rasp
框架
SPI
asm
maven
idea
依赖管理
module
helm
逻辑回归
S函数
IOS
Fiddler
Andriod
Protocol Buffer
kryo
车联网,大数据,神经网络
字节序
最小二乘法
线性代数
线性回归
最大似然法
网络编程
大数据
树莓派
Raspbian
redis
海南
分析
人口
函数式编程
clojure
线程
并行
actor
红黑树
数组
动态数组
tcp
编程
markdown
二叉搜索树
AVL树
数据结构
golang
梯度下降法
skaffold
k8s
机器学习
选法
一致性
算法
分布式
paxos
Raft
一致性协议
引擎
容器
通信
微服务
Kubernetes
docker
文件系统
NFS
神经网络
神经元
深度学习
poi
反向传播
java
并发模型
并发
多线程
Scala