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

  1. import sys
  2. class apache(object):
  3. def __init__(self,tcp):
  4. self.tcp = tcp
  5. def start(self):
  6. print("apache is starting,host id is [%s]" %self.tcp)
  7. def stop(self):
  8. print("apache is stoping,host id is [%s]" %self.tcp)
  9. def restart(self):
  10. self.stop()
  11. self.start()
  12.  
  13. if __name__ == '__main__':
  14. server = apache("333")
  15. if hasattr(server,sys.argv[1]): #判断实例中是否有ays.argv[1]这个方法
  16. func = getattr(server,sys.argv[1]) #获取server.sys.argv[1]方法的内存地址
  17. func() #执行server.sys.argv[1]这个方法
  18.  
  19. # apache is starting,host id is [333]

再看下setattr在反射中的运用

  1. import sys
  2. class apache(object):
  3. def __init__(self,tcp):
  4. self.tcp = tcp
  5. def start(self):
  6. print("apache is starting,host id is [%s]" %self.tcp)
  7. def stop(self):
  8. print("apache is stoping,host id is [%s]" %self.tcp)
  9. def restart(self):
  10. self.stop()
  11. self.start()
  12.  
  13. def test_run(name):
  14. print("running",name)
  15.  
  16. if __name__ == '__main__':
  17. server = apache("333")
  18. setattr(server,"run",test_run)
  19. #我们可以看到,本来server这个实例本身是没有test_run这个方法的,且test_run和apache这个类根本就没有任何关系,但是我们通过setattr方法,就可以把外面的函数赋值给
  20. #某个实例,比如这里的例子,我们就把函数test_run的内存地址赋值给了server.run,也就是说test_run == server.run
  21. #注意,这里只绑定到server这实例上,其他实例还是不能用test_run这个方法的
  22. server.run("alex")
  23.  
  24. #上面的例子中,在test_run中不能使用实例变量,我们可以通过下面的方法就可以实现test_run函数可以调用实例变量
  25.  
  26. #定义函数需要按照下面的格式来定义
  27. def test_run(self,name):
  28. print("running",name,self.tcp)
  29.  
  30. if __name__ == '__main__':
  31. server = apache("333")
  32. setattr(server,"run",test_run)
  33. #调用的时候需要这样调用
  34. server.run(server,"alex")

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

  1. import sys
  2. class apache(object):
  3. def __init__(self,tcp):
  4. self.tcp = tcp
  5. def start(self):
  6. print("apache is starting,host id is [%s]" %self.tcp)
  7. def stop(self):
  8. print("apache is stoping,host id is [%s]" %self.tcp)
  9. def restart(self):
  10. self.stop()
  11. self.start()
  12.  
  13. if __name__ == '__main__':
  14. server = apache("1000")
  15. # delattr(server,"stop")
  16. # server.stop()
  17.  
  18. #这样的写法是错误的,因为stop这个方法不属于对象,而属于类,所以删除对象中的stop方法肯定是不可以的
  19. print(server.tcp)
  20. # 1000
  21. # delattr(server,"tcp")
  22. # print(server.tcp)
  23. #所以如果我们删除对象的话,只能删除对象的变量,上面这个例子,我们就可以删除对象中的变量,然后在打印就发现没有这个值了
  24.  
  25. # 所以如果要删除方法,那么我们只能删除类的方法,而不能删除对象的方法,因为方法都是属于类的
  26.  
  27. #在删之前我们先判断一下对象中是否有stop这个方法
  28. if hasattr(apache,"stop"):
  29. print(True)
  30. else:
  31. print(False)
  32.  
  33. # True 结果证明有stop这个方法
  34.  
  35. #在删之后我们在判断一下对象中是否有stop这个方法
  36. delattr(apache,"stop")
  37. if hasattr(apache,"stop"):
  38. print(True)
  39. else:
  40. print(False)
  41. # 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. 如何使用沙箱测试单笔转账到支付宝账号(php版) https://openclub.alipay.com/read.php?tid=1770&fid=28

    说明:   本帖是利用支付宝沙箱测试电脑网站支付接口   测试环境:Apache2.4.23 +php 5.6.25   沙箱环境测试正式环境请修改网关为下方值   复制代码 1 正式环境网关:htt ...

  2. springMVC 是单例还是的多例的?

    曾经面试的时候有面试官问我spring的controller是单例还是多例,结果我傻逼的回答当然是多例,要不然controller类中的非静态变量如何保证是线程安全的,这样想起似乎是对的,但是不知道( ...

  3. 第11课 enum、sizeof、typedef 分析

    1. enum枚举类型 1.1 使用方法 (1)enum是C语言中的一种自定义类型 (2)enum值是可以根据需要自定义的的整型值 (3)第一个定义的enum值默认为0. (4)默认情况下的enum值 ...

  4. Git强制拉取覆盖本地 Pull force

    git fetch --all git reset --hard origin/master git pull 单条执行 git fetch --all && git reset -- ...

  5. 邮件服务端口 port 25、109、110、143、465、995、993

    邮件服务端口 port 25.109.110.143.465.995.993   25端口(SMTP):25端口为SMTP(Simple Mail TransferProtocol,简单邮件传输协议) ...

  6. UVA-568-数论

    题意 输入一个n,求n!最后一个不是0的数 2x5肯定是等于10的,先把所有不是2和5的数乘起来,保留最后一位 计算过程中计算出2和5的个数 因为2*5=10,而且2的个数比5的个数多,所以最后只要把 ...

  7. Elasticsearch究竟要设置多少分片数?

    0.引言 本文翻译自Elasticsearch20170918热乎的官方博客,原作者:Christian Dahlqvist. 在构建Elasticsearch集群的初期如果集群分片设置不合理,可能在 ...

  8. leetcode949

    public class Solution { public string LargestTimeFromDigits(int[] A) { ); ; ; foreach (var nums in l ...

  9. VisualSVN: 只能修改自己提交日志

    上回讲过怎么修改日志信息,这次想提交怎么只能修改自己提交的. 现在演示用户111来修改libra的日志信息 这个公正的SVN出现了 用户111说小样,不让我改,那我修改自己提交的日志总行了吧!! 我改 ...

  10. spring-boot + mybatis +pagehelper 使用分页

    转自:https://segmentfault.com/a/1190000015668715?utm_medium=referral&utm_source=tuicool 最近自己搭建一个sp ...