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

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

反射

  • 通过字符串映射或修改程序运行时的状态,属性,方法.
  • 有以下四种方法:
    • getattr(object, name, default = None)
    • hasattr(object, name)
    • setattr(x,y,v)
    • delattr(x,y)
    • #!/usr/bin/python# -*- coding: utf-8 -*-def bulk(self):    print("%s is yelling...." % self.name)class Dog(object):    def __init__(self, name):        self.name = name    def eat(self, food):        print("%s is eating %s...", self.name, food)    def walk(self):        print("%s is walking...", self.name)d = Dog("NHY")choice = input(">>:").strip()   # 用户输入"吃", 就调用eat()方法; 用户输入"走", 就调用walk()方法# print(hasattr(d, choice))  # 判断用户输入是否存在于实例d中. 若用户输入eat, 会返回True;  若用户输入talk,会返回False."""但是即使eat返回True,也不能直接调用 d.choice, 因为choice是不存在的, 必须把用户输入的eat调出来, 需要用到getattr()方法"""# print(getattr(d, choice))  # 若用户输入eat, 就返回一个内存地址(返回内存地址之后, 加括号就能调用相应方法了); 若用户输入talk,因为不存在, 会返回False.# getattr(d, choice)("包子")  # 若用户输入eat,此行代码相当于调用 eat()方法. 若不需要传参数, 直接getattr(d, choice)()即可."""反射步骤总结:   1. hasattr(obj, name_str) 判断是否存在某字符串的方法映射  2. getattr(obj, name_str) 若该映射存在, 获取该映射对应方法的内存地址  3a. getattr(obj, name_str)() 如果是一个方法, 获取内存地址之后, 调用相关方法  3b. setattr(ojb, 'y', v) 如果是一个属性, 重新设置该属性的值. is equivalent to obj.y = v.  4. delattr() 删除一个属性"""# 传递一个动态方法if hasattr(d, choice):    # getattr(d, choice)()  # 这样直接调用eat()方法, 有时还需要传参数,可以用下面的方法    func = getattr(d, choice)    func("馒头")else:    setattr(d, choice, bulk)  # 传递一个动态方法. 即不存在的映射, 可以添加. 但是前提相关方法必须已经存在.    setattr(d, choice, None)  # 传递一个动态属性d.talk(d)  # 用户输入talk, 所以要调用talk(),而不是bulk(). bulk相当于一个变量名, 此处因用户输入了talk,用talk来代替. 相当于d.talk = bulk, 所以d.talk()就是调用bulk()方法."""上面写死了. 因为不确定用户choice会输入什么, 所以应该用一个变量来接收getattr()的值"""if hasattr(d, choice):    # getattr(d, choice)()  # 这样直接调用eat()方法, 有时还需要传参数,可以用下面的方法    func = getattr(d, choice)    func("馒头")else:    setattr(d, choice, bulk)  # 传递一个动态方法. 即不存在的映射, 可以添加. 但是前提相关方法必须已经存在.    setattr(d, choice, None)  # 传递一个动态属性    func = getattr(d, choice)    func(d)  # 这样不论用户choice输入的是什么都可以直接调用func(d)来执行了.不用写死成d.talk().# 传递一个动态属性, 或给已有属性重新赋值if hasattr(d, choice):    attr = getattr(d, choice)    setattr(d, choice, "RGH")  # 更改已有属性值. 在choice里填name, 改的就是name的值.else:     setattr(d, choice, None)  # 传递一个动态属性. None是这个动态属性的默认值.可以是None,也可以是其它值,如2233等.     # setattr(d, choice, 22)     print(getattr(d, choice))print(d.name)# 删除一个属性if hasattr(d, choice):    delattr(d, choice)

       

 

转载于:https://www.cnblogs.com/cheese320/p/9227340.html

你可能感兴趣的文章
Go并发编程实践
查看>>
CSS margin详解
查看>>
cesium编程入门(三)开始使用cesium开发
查看>>
4.18n阶勒让德多项式求解
查看>>
RTMP协议分析及推流过程
查看>>
PAT天梯赛L1-054 福到了
查看>>
Pains and Sickness 学习笔记
查看>>
PHP变量测试函数
查看>>
第六天 基本文件管理与XFS文件系统备份恢复
查看>>
win10中强制vs2015使用管理员启动
查看>>
UISerachBar / UISearchDisplayController
查看>>
Linux常用的操作命令
查看>>
Redis Desktop Manager
查看>>
css书写规范
查看>>
Asp.net +Jquery-uploadify多文件上传
查看>>
【恐怖的数组模拟】Secret Poems - HihoCoder - 1632
查看>>
大规模机器学习
查看>>
EasyPlayerPro(Windows)流媒体播放器开发之接口设计
查看>>
寻找数组中子数组和的最大值
查看>>
如何系统的进入大数据领域,学习路线是什么?
查看>>