python-反射、新式类与经典类搜索的优先级
preface
include:
- getattr
- setattr
- delattr
- hasattr
class webserver(object):
def __init__(self,num):
self.num=num
def stop(self):
print("Stop the server !!")
def start(self):
print("Start the server !!")
def restart(self):
self.stop()
self.start()
print("Restart the server")
def run_test():
print("Reload the server")
if __name__ =="__main__":
server=webserver(1)
server2=webserver(1)
hasattr
if hasattr(server,sys.argv[1]):
func=getattr(server,sys.argv[1]) # getattr其实是在server这个实例中寻找和sys.argv[1]这个字符串相同的方法,并且返回一个内存地址
func()
setattr
setattr 是这么玩: setattr(x, 'y', v) is equivalent to ``x.y = v'',意思是第一个输入的是实例的名字,第二个是属性的别名,第三个函数名(类里面已有的方法)
setattr(server,'reload',run_test)
server.reload()
delattr
delattr 是这么玩 delattr(x, 'y') is equivalent to ``del x.y'' ,x是类名,y是类的方法名
delattr(webserver,'start')
此时我们把类的start方法删除后,对象server就没有start方法了,执行下面句的时候就会报错了
server.start()
```
#### 新式类与经典类搜索的优先级
在python2.7 2.6版本内是这样的:
1. 经典类是深度优先
2. 新式类是广度优先
在python3.0 版本是:
1. 不关新式类还是经典类,都是广度优先。
#### 例子:
```
#!/usr/bin/env python
'''
类的继承之深度优先还是广度优先
'''
class A:
def f1(self):
print("f1 from A")
def f2(self):
print("f2 from A")
class B:
def f1(self):
print("f1 from B")
def f2(self):
print("f2 from B")
class C:
def f1(self):
print("f1 from C")
def f2(self):
print("f2 from C")
class D(B,C):
pass
d=D()
```
此时D继承了类B,C,那么执行f1方法的时候,首先从同样等级的父类的子类里面,从左往右执行。也就是首先从B里面找f1,f2,
如果B里面没有f1,f2,那么就找C里面的,C里面也没有的话就往C和B的父类往上找,直到找到为止,这就是广度优先
在python2.7 2.6版本内是这样的:
1. 经典类是深度优先
2. 新式类是广度优先
在python3.0 版本是:
不关新式类还是经典类,都是广度优先。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构