博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python之面向对象之反射运用
阅读量:6207 次
发布时间:2019-06-21

本文共 2623 字,大约阅读时间需要 8 分钟。

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

import sysclass 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 sysclass 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 sysclass 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这个方法

  

转载于:https://www.cnblogs.com/bainianminguo/p/7208598.html

你可能感兴趣的文章
如何解决 SogouIinput not enough space for thread data ?? 虚拟内存
查看>>
与非CCR代码互操作
查看>>
AndroidManifest.xml 详解 (四) 之uses-permission
查看>>
Python -- 堆数据结构 heapq - I love this game! - 博客频道 - CSDN.NET
查看>>
Go:Hello World!
查看>>
恶补java基础 位运算符
查看>>
关于PHP程序使用file_get_content()函数进行抓取PHP程序与smarty结合编译过程中产生的静态文件,抓取不了?连接超时?(地址映射)...
查看>>
express
查看>>
在Linux和Windows平台上操作MemoryMappedFile(简称MMF)
查看>>
如何设计一门语言(十一)——删减语言的功能
查看>>
是否能确定唯一二叉树
查看>>
juc线程池原理(五):拒绝策略示例
查看>>
系统升级日记(1)- 升级到SQL Server 2012
查看>>
系统升级日记(2)- 升级到SharePoint Server 2013
查看>>
游戏:弹球敲方块
查看>>
servlet request
查看>>
单链表
查看>>
C# GDI+ 处理文本的两个小技巧
查看>>
sql 锁
查看>>
【原/转】opencv的级联分类器训练与分类全程记录
查看>>