博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python_反射
阅读量:7055 次
发布时间:2019-06-28

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

反射:根据字符串来获取相应的内存对象(相应对象的内存地址)

关于反射的几个函数:hasattr(),  getattr(),  setattr(),  delattr()

1. hasattr(object,name)                                                      

判断一个对象里是否有name属性或者方法,如果有返回Ture,否则返回False

2.getattr(object,name[,default])                                       

获取对象object的属性或方法,若存在则打印出来,若不存在打印默认值

(注:若返回对象是方法,则返回的是方法的内存地址)

import sysclass Animal(object):    def __init__(self,name):        self.name = name    def Dog(self):        print('%s 吃粑粑。。' % self.name)    def Cat(self):        print('%s 喵喵叫。。' % self.name)    def Print_A(self):        self.Dog()        self.Cat()if __name__=='__main__':    D = Animal('狗类')    C = Animal('猫类')#    D.Dog()#    C.Cat()    if hasattr(D, sys.argv[1]):       # 判断D实例中,是否有Dog属性        func = getattr(D, sys.argv[1])         # 获取D.Dog方法的内存地址        func()    else:        print('Animal中没有这个类。。')
示例代码
D:\1.pycharm>dir 驱动器 D 中的卷是 软件 卷的序列号是 0002-A33B D:\1.pycharm 的目录2018/10/26  15:13    
.2018/10/26 15:13
..2018/10/26 16:19
.idea2018/09/07 08:18
day 2018_09_062018/08/13 16:37
day12018/09/09 18:35
day22018/09/05 10:05
day2018_09_042018/09/07 19:40
day2018_09_072018/09/09 09:47
day2018_09_082018/09/18 21:01
day2018_09_102018/09/13 10:27
day2018_09_122018/09/13 10:55
day2018_09_132018/09/14 18:18
day2018_09_142018/09/17 17:56
day2018_09_162018/09/18 16:56
day2018_09_172018/09/18 21:20
day2018_09_182018/09/21 17:41
day2018_09_192018/09/22 15:10
day2018_09_212018/09/24 21:16
day2018_09_222018/09/27 18:16
day2018_09_252018/10/13 17:41
day2018_09_262018/10/19 18:13
day2018_10_142018/10/25 16:57
day2018_10_182018/10/25 21:00
day2018_10_252018/10/26 16:18
day2018_10_262018/09/07 16:44
day2018_9_52018/08/16 16:59
day32018/09/03 20:48
day42018/09/03 20:53
test 0 个文件 0 字节 29 个目录 67,621,523,456 可用字节D:\1.pycharm>cd day2018_10_26D:\1.pycharm\day2018_10_26>dir 驱动器 D 中的卷是 软件 卷的序列号是 0002-A33B D:\1.pycharm\day2018_10_26 的目录2018/10/26 16:18
.2018/10/26 16:18
..2018/10/26 15:13 0 __init__.py2018/10/26 16:18 773 反射.py 2 个文件 773 字节 2 个目录 67,621,457,920 可用字节D:\1.pycharm\day2018_10_26>python 反射.py habitAnimal中没有这个类。。D:\1.pycharm\day2018_10_26>python 反射.py Dog狗类 吃粑粑。。
Terminal操作

注:

  • sys.argv[1]:表示传入的系统命令参数
    • 如D:\1.pycharm\day2018_10_26>python 反射.py Dog
  • sys.argv[0]:表示获取脚本本身的名称

3.setattr(object,name,values)                                              

给对象的属性赋值,若属性不存在,先创建再赋值

(注:可用于给实例绑定方法)

import sysclass Animal(object):    Rabbit='兔子吃草。。略略略'    def __init__(self,name):        self.name = name    def Dog(self):        print('%s 吃粑粑。。' % self.name)    def Cat(self):        print('%s 喵喵叫。。' % self.name)    def Print_A(self):        self.Dog()        self.Cat()def Tortoise(name):    print('%s 吃肉肉。。' % name)def Tortoise1(self,name):       # 这样就可以调用Animal里的属性或者方法了    print('%s 吃肉肉。。' % name,self.Rabbit)if __name__=='__main__':    D = Animal('狗类')    C = Animal('猫类')#    D.Dog()#    C.Cat()    setattr(D, 'T', Tortoise)   # D为实例,‘T’为给Dog1绑定到D的名字,Tortoise为被绑定的方法名    D.T('龟龟类')   # 把方法绑定在实例上的   # C.T('龟龟类')   这里会调用失败,说明只是把Tortoise方法绑定在 D 实例上    setattr(C, 'T1', Tortoise1)    C.T1(C,'龟龟类')     # 这里需要把如果Tortoise1里想要调用Animal里的东西需要把Animal或实例化了的C或D任意一个传进去
setattr
龟龟类 吃肉肉。。龟龟类 吃肉肉。。 兔子吃草。。略略略
result

4.delattr(object,'name')                                                        

删除object对象的方法或属性

import sysclass Animal(object):    Rabbit='兔子吃草。。略略略'    def __init__(self,name):        self.name = name    def Dog(self):        print('%s 吃粑粑。。' % self.name)    def Cat(self):        print('%s 喵喵叫。。' % self.name)    def Print_A(self):        self.Dog()        self.Cat()def Tortoise(name):    print('%s 吃肉肉。。' % name)if __name__=='__main__':    D = Animal('狗类')    C = Animal('猫类')#    D.Dog()#    C.Cat()    setattr(D, 'T', Tortoise)   # D为实例,‘T’为给Dog1绑定到D的名字,Tortoise为被绑定的方法名    D.T('龟龟类')   # 把方法绑定在实例上的   # C.T('龟龟类')   这里会调用失败,说明只是把Tortoise方法绑定在 D 实例上    # delattr(D,'Dog')       # D 是实例,无法删除Animal类里的方法   # delattr(Animal,'Dog')       # 但是可以类删除里面的方法   # D.Dog()           #   AttributeError: 'Animal' object has no attribute 'Dog'    delattr(D, 'T')      # 可以删除实例绑定的方法'T'    D.T('龟龟类')
delattr

 

转载于:https://www.cnblogs.com/Vera-y/p/9857659.html

你可能感兴趣的文章
常用正则表达式
查看>>
懒加载和预加载的实现
查看>>
关于跨域的ajax
查看>>
线性回归——最小二乘法_实例(一)
查看>>
51单片机——蓝牙远程点灯
查看>>
查询优化
查看>>
python常见面试集合
查看>>
Design pattern---观察者模式
查看>>
20_集合_第20天(Map、可变参数、Collections)
查看>>
产品经理常用软件和网址
查看>>
Beta版本使用说明
查看>>
无法使用管理登录 解决办法
查看>>
FMDB
查看>>
Entity Framework Tutorial Basics(11):Code First
查看>>
黑客经验谈:跳板攻击入侵技术实例解析
查看>>
python编程规范系列--建议01~07
查看>>
CSS最佳实践团队开发
查看>>
笨办法12提示别人
查看>>
mybatis动态sql之foreach
查看>>
编程常用密匙
查看>>