先看下hasattr和getattr在反射中的用法

import sys
class apache(object):
def __init__(self,tcp):
self.tcp = tcp
def start(self):
print("apache is starting,host id is [%s]" %self.tcp)
def stop(self):
print("apache is stoping,host id is [%s]" %self.tcp)
def restart(self):
self.stop()
self.start() if __name__ == '__main__':
server = apache("333")
if hasattr(server,sys.argv[1]): #判断实例中是否有ays.argv[1]这个方法
func = getattr(server,sys.argv[1]) #获取server.sys.argv[1]方法的内存地址
func() #执行server.sys.argv[1]这个方法 # apache is starting,host id is [333]

再看下setattr在反射中的运用

import sys
class apache(object):
def __init__(self,tcp):
self.tcp = tcp
def start(self):
print("apache is starting,host id is [%s]" %self.tcp)
def stop(self):
print("apache is stoping,host id is [%s]" %self.tcp)
def restart(self):
self.stop()
self.start() def test_run(name):
print("running",name) if __name__ == '__main__':
server = apache("333")
setattr(server,"run",test_run)
#我们可以看到,本来server这个实例本身是没有test_run这个方法的,且test_run和apache这个类根本就没有任何关系,但是我们通过setattr方法,就可以把外面的函数赋值给
#某个实例,比如这里的例子,我们就把函数test_run的内存地址赋值给了server.run,也就是说test_run == server.run
#注意,这里只绑定到server这实例上,其他实例还是不能用test_run这个方法的
server.run("alex") #上面的例子中,在test_run中不能使用实例变量,我们可以通过下面的方法就可以实现test_run函数可以调用实例变量 #定义函数需要按照下面的格式来定义
def test_run(self,name):
print("running",name,self.tcp) if __name__ == '__main__':
server = apache("333")
setattr(server,"run",test_run)
#调用的时候需要这样调用
server.run(server,"alex")

最后看下delattr在反射中的运用

import sys
class apache(object):
def __init__(self,tcp):
self.tcp = tcp
def start(self):
print("apache is starting,host id is [%s]" %self.tcp)
def stop(self):
print("apache is stoping,host id is [%s]" %self.tcp)
def restart(self):
self.stop()
self.start() if __name__ == '__main__':
server = apache("1000")
# delattr(server,"stop")
# server.stop() #这样的写法是错误的,因为stop这个方法不属于对象,而属于类,所以删除对象中的stop方法肯定是不可以的
print(server.tcp)
# 1000
# delattr(server,"tcp")
# print(server.tcp)
#所以如果我们删除对象的话,只能删除对象的变量,上面这个例子,我们就可以删除对象中的变量,然后在打印就发现没有这个值了 # 所以如果要删除方法,那么我们只能删除类的方法,而不能删除对象的方法,因为方法都是属于类的 #在删之前我们先判断一下对象中是否有stop这个方法
if hasattr(apache,"stop"):
print(True)
else:
print(False) # True 结果证明有stop这个方法 #在删之后我们在判断一下对象中是否有stop这个方法
delattr(apache,"stop")
if hasattr(apache,"stop"):
print(True)
else:
print(False)
# False 结果证明没有stop这个方法

  

python之面向对象之反射运用的更多相关文章

  1. Python之面向对象进阶------反射(Day26)

    一 classmethod class Classmethod_Demo(): role = 'dog' @classmethod def func(cls): print(cls.role) Cla ...

  2. Python之面向对象之反射、内置方法

    一.静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静态方法:让类里的方法直接被 ...

  3. python 之 面向对象(反射、__str__、__del__)

    7.10 反射 下述四个函数是专门用来操作类与对象属性的.通过字符串来操作类与对象的属性,这种操作称为反射 class People: country="China" def __ ...

  4. Python 面向对象之反射

    Python 面向对象之反射 TOC 什么是反射? hasattr getattr setattr delattr 哪些对象可以使用反射 反射的好处 例子一 例子二 什么是反射? 程序可以访问.检查和 ...

  5. python 面向对象之反射及内置方法

    面向对象之反射及内置方法 一.静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静 ...

  6. Python之面向对象反射

    Python之面向对象反射 isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 class Foo(object): 2 pass 3 4 obj = Foo() 5 6 ...

  7. 百万年薪python之路 -- 面向对象之 反射,双下方法

    面向对象之 反射,双下方法 1. 反射 计算机科学领域主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省) python面向对象中的反射:通过字符串的形式操作对象相关的属性.python ...

  8. python基础——面向对象进阶

    python基础--面向对象进阶 1.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 ...

  9. python学习------面向对象的程序设计

    一 面向对象的程序设计的由来 1940年以前:面向机器 最早的程序设计都是采用机器语言来编写的,直接使用二进制码来表示机器能够识别和执行的指令和数 据.简单来说,就是直接编写 和 的序列来代表程序语言 ...

随机推荐

  1. 深入浅出 JIT 编译器

    转载 https://www.ibm.com/developerworks/cn/java/j-lo-just-in-time/ JIT 编译器在运行程序时有两种编译模式可以选择,并且其会在运行时决定 ...

  2. python的return self的用法

    转载:https://blog.csdn.net/jclian91/article/details/81238782 class foo: def __init__(self): self.m = 0 ...

  3. javascript的密封对象之seal(),isSealed()方法

    EcmaScrip5t中出现了密封对象概念.密封对象不可扩展,而已有的成员的[Configurable]特性被设置为false.也就是说属性和方法是不能删除的.但是是可以修改的. 示例一: var p ...

  4. WGCNA 分析

    https://www.jianshu.com/p/f80de3468c04 https://mp.weixin.qq.com/s/-DthUKY2RTY6vxtxapzLkw https://www ...

  5. 粗解python的@classmethod和@staticmethod及普通实例方法

    引言: 使用不同的函数定义方法,可以使得函数定义更加有效而且易于维护 本文为博主原创,根据本人自己的理解整理而成,若有不准确的地方,希望能留言告知以免误导他人: 首先进一段代码,来直观感受一下不同类型 ...

  6. uva-10152-乌龟排序

    求从待排序的到期望的顺序的最小操作顺序,只能进行一个操作,将当前的乌龟拿出来,上面的下移,拿出来的放到最上面 发现voj没有PE, 解题方法,把俩个串反过来使用,从期望的顺序到待排序的顺序. AC:1 ...

  7. 局部敏感哈希-Locality Sensitivity Hashing

    一. 近邻搜索 从这里开始我将会对LSH进行一番长篇大论.因为这只是一篇博文,并不是论文.我觉得一篇好的博文是尽可能让人看懂,它对语言的要求并没有像论文那么严格,因此它可以有更强的表现力. 局部敏感哈 ...

  8. Java的Guava

    主要是看代码看到了Table这个类,竟然有两个键! http://www.cnblogs.com/peida/p/3183505.html

  9. Star打印机数据解密

    通过串口调试工具 抓取到的16进制文本; 如下 然后打开我们的文档,查看命令数据内容. 详情请密我QQ:1161588342  说明加好友原因

  10. as3 中 final 修饰符

    现在,在ActionScript 3.0的修饰符中,只有final修饰符没有介绍.之所有放在这里介绍,是因为final修饰符只与继承有关,指定一个方法不能被重写或一个类不能被继承. 一般来说,当用fi ...