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 版本是:
不关新式类还是经典类,都是广度优先。
python-反射、新式类与经典类搜索的优先级的更多相关文章
- Python新式类与经典类的区别
1.新式类与经典类 在Python 2及以前的版本中,由任意内置类型派生出的类(只要一个内置类型位于类树的某个位置),都属于“新式类”,都会获得所有“新式类”的特性:反之,即不由任意内置类型派生出的类 ...
- python中的__new__与__init__,新式类和经典类(2.x)
在python2.x中,从object继承得来的类称为新式类(如class A(object))不从object继承得来的类称为经典类(如class A()) 新式类跟经典类的差别主要是以下几点: 1 ...
- python中新式类和经典类的区别
1).python在类中的定义在py2-3版本上是使用的有新式类和经典类两种情况,在新式类和经典类的定义中最主要的区别是在定义类的时候是否出现引用object;如:经典类:Class 类名::而新式类 ...
- python之继承、抽象类、新式类和经典类
一.上节补充1.静态属性静态属性 : 类的属性,所有的对象共享这个变量 如果用对象名去修改类的静态属性:在对象的空间中又创建了一个属性,而不能修改类中属性的值 操作静态属性应该用类名来操作 例1:请你 ...
- Python 新式类与经典类
新式类,经典类 查询匹配 广度查询 横着对每个类进行查询 深度查询 无视平级类,直接寻找下级类 #python 3.0 #新式类 广度查询 #经典类 广度查询 #python 2.0 #新式类 广度查 ...
- python单例模式控制成只初始化一次,常规型的python单例模式在新式类和经典类中的区别。
单例模式的写法非常多,但常规型的单例模式就是这样写的,各种代码可能略有差异,但核心就是要搞清楚类属性 实例属性,就很容易写出来,原理完全一模一样. 如下: 源码: class A(object): d ...
- python中新式类和经典类
python中的类分为新式类和经典类,具体有什么区别呢?简单的说, 1.新式类都从object继承,经典类不需要. Python 2.x中默认都是经典类,只有显式继承了object才是新式类 Pyth ...
- Python新式类和经典类的区别
@Python新式类和经典类的区别 class ClassicClass(): pass class NewStyleClass(object): pass x1 = ClassicClass() x ...
- Python类总结-继承-子类和父类,新式类和经典类
子类和父类 class Father(object): #子类在使用super调用父类时,Father后面要加object --新式类 def __init__(self): self.Fname = ...
随机推荐
- [转]Ext.grid常用属性和方法
原文地址:http://blog.csdn.net/fm19901229/article/details/8113969 1.Ext.grid.GridPanel 主要配置项: store:表格的 ...
- python3 scrapy 安装记录
一开始,想通过pycharm 直接安装,没想到出现下面的错误: Microsoft Visual C++ 14.0 is required... 的错误 网上有方法,是通过安装 VC++14.0 ,但 ...
- Linux shell while
sh count=1 while [ $count -le 5 ]; do echo 1234567890abcdefghqwertyuiopdasdk > /dev/ttyS1 & e ...
- Virtools元素、类和面向对象设计
无意中发现了在某个不存在的网站( https://sites.google.com )上,还存有09年写的一些半成品教材,下面这篇文章就是其中一部分. 概述 Virtools将元素(Element)组 ...
- [ADC]TI am4378 ADC采样设置问题(am335x类似)
这段时间在调试AM4378的ADC问题,发现采样到的数据和真实输入波形有所出入,比如输入是1ms的周期,50%占空比的信号,但是采样的数据描点总是偏差较大,数据如下 iio device number ...
- asp.net cookie的操作
//写入 protected void Button2_Click(object sender, EventArgs e) { HttpCookie cookie=new Ht ...
- 百度地图Api进阶教程-地图鼠标左右键操作实例和鼠标样式6.html
<!DOCTYPE html> <html> <head> <meta name="viewport" content="ini ...
- 1 php protocolbuffers安装
安装工具 yum install autoconf yum install libtool 安装protoc编译器 # cd /root/soft/protobuf- autogen.sh : if ...
- PHP 调试利器之 PHPDBG
简介 PHPDBG是一个PHP的SAPI模块,可以在不用修改代码和不影响性能的情况下控制PHP的运行环境. PHPDBG的目标是成为一个轻量级.强大.易用的PHP调试平台.可以在PHP5.4和之上版本 ...
- Qt封装QTcpServer参考资料--QT4中构建多线程的服务器
首先说一下对多线程这个名词的理解过程.以前听说过很多次多线程这个词,而且往往与服务器联系起来,因此一直把多线程误解为服务器特有的功能:直到这次课程设计,仔细学习了一下多线程的机制,才知道真正的意思.简 ...