首页 > 编程语言 >【十七】Python中的反射机制(4)

【十七】Python中的反射机制(4)

时间:2023-06-01 20:47:28浏览次数:43  
标签:__ 反射 十七 name Python self object add print

【十七】Python中的反射机制(4)

【1】什么是反射?

  • 反射指在程序运行过程中可以动态获取对象的信息。
    • 是通过字符串的形式,导入模块;
    • 通过字符串的形式,去模块寻找指定函数,并执行。
    • 利用字符串的形式去对象中操作成员,一种基于字符串的驱动

【2】Python反射中的内置函数

(1)getattr()
  • getattr():
    • 用于获取对象中的属性
    • 但是其不能获取私有变量也就是最前面带__的属性或方法

getattr(object,name,default)其有三个参数

  1. object:对象
  2. name:对象中的属性值
  3. default:可选 该对象中不存在该属性的时候的返回值。
  • 示例
class B:
    def __init__(self):
        self.name = 'Bb'
        self.age = 40

    def add(self):
        print('B')


if __name__ == '__main__':
    b = B()
    print(getattr(b, 'name', 'not found'))  # 输出:Bb
    print(getattr(b, 'cc', 'not found'))  # 输出:not found
    func = getattr(b,'add',None)
    print(func)  # 输出:<bound method B.add of <__main__.B object at 0x00000248C7F48648>>
    func()  # 输出:B
(2)hasattr()
  • hasattr(object,name)

    • 该函数用于检测对象(object)中是否含有name (指的是某个属性名而并不是指name) 这个属性
      • 其中object是对象
      • name是指需要检查该对象中是否存在的属性的名称。
  • 示例

class B:
    def __init__(self):
        self.name = 'Bb'
        self.age = 40

    def add(self):
        print('B')


if __name__ == '__main__':
    b = B()
    print(hasattr(b, 'ccc')) # False
    print(hasattr(b, 'add')) # True
(3)setattr()
  • setattr(object,name,value)

    • 是指给某个对象某个属性设置指定的值
      • object是对象
      • name是对象中的属性名
      • value是你想要设的值。
    • 其中三个参数都是必须的填的。
  • 该函数可以给对象增加新的属性并且可以将对象中的方法改变。

  • 示例

class B:
    def __init__(self):
        self.name = 'Bb'
        self.age = 40

    def add(self):
        print('B')


if __name__ == '__main__':
    b = B()
    print(b.age)  # 40
    setattr(b,'age',50)
    print(b.age)  # 50

    def cc():
        print('i am changed')
	b.add() # B
    setattr(b,'add',cc)
    b.add() # i am changed
    # print(dir(b))
(4)delattr()
  • delattr(object,name)

    • 指删除对象中的指定属性
      • 其中object是对象
      • name是对象中的属性名。
  • 示例

class B:
    def __init__(self):
        self.name = 'Bb'
        self.age = 40

    def add(self):
        print('B')


if __name__ == '__main__':
    b = B()
    print(dir(b))  # [,'add', 'age', 'name'] dir()函数会输出一大堆,在这里我把输出的一些属性名直接删除了
    print(hasattr(b,'age'))  # True
    delattr(b,'age')
    print(dir(b))  # [,'add', 'name']
    print(hasattr(b,'age'))  # False

我在这里再补充说明下dir() 这个函数: dir()不带变量时候用于获取当前范围内的变量、方法和定义的类型列表;带参数时返回参数的属性、方法列表。

dir(object) object:对象、变量、类型

  • 以上就是python反射中的四个内置函数。

【3】Python反射的应用

  • 反射的一个应用就是web框架中的url路由
    • 用户通过输入url路由就可以定位到views视图中的函数
    • 这里面主要应用了getattr() 这个函数(一个用于获取views视图中对应函数
      • 如果没有就返回你设定的值以此判断是否可以往下执行。

标签:__,反射,十七,name,Python,self,object,add,print
From: https://www.cnblogs.com/dream-ze/p/17450146.html

相关文章

  • 【二十四】Python中super()详解及应用场景举例(1)
    【二十四】Python中super()详解及应用场景举例(1)【1】作用super也是一个类,是的。他不是一个方法也不是一个内置的关键字。classA:passprint(type(super(A)))#<class'super'>直接通过查看super的源码也可以看出它是一个类classsuper(object):"""......
  • 【二十三】Python 中 property() 函数及 @property 装饰器的使用(1)
    【二十三】Python中property()函数及@property装饰器的使用(1)【1】property应用场景在获取、设置和删除对象属性的时候,需要额外做一些工作。比如在游戏编程中,设置敌人死亡之后需要播放死亡动画。需要限制对象属性的设置和获取。比如用户年龄为只读,或者在设置用户......
  • Python循环语句
    #循环语句#使用while循环打印出0-100的所有数字#循环的初始化条件num=1#当num<100时,会一直执行循环体whilenum<101:  print("num=",num)  #迭代语句  num+=1print("循环结束")print("---------------------------")#使用while遍历字符串str="TheageofM......
  • C温故补缺(十七):动态链接(ELF,PIC,GOT,PLT)
    动态链接(PIC,GOT,PLT,ELF)参考:51CTO通过静态链接,可以生成一个可执行文件,这个可执行文件既可以是完全链接的也可以是部分链接的,对于部分链接的可执行文件,有些符号引用需要等到可执行文件加载时甚至是运行时才会进行符号解析和重定位。动态链接与静态链接一样包括符号解析和重......
  • 【Python】pandas dataframe 插入一行数据
    pandas插入一行数据#需要借助numpy操作importnumpyasnpimportpandasaspdvalue={"a":[1,2,3],"b":[1,2,3],"c":[1,2,3]}df=pd.DataFrame(value)df1=pd.DataFrame(np.insert(df.values,0,values=[0,0,0],axis=0))df1.columns=df......
  • JAVA 反射应用:Annotation
    SomeClass.javaimportjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;importjava.lang.reflect.Method;publicclassSomeClass{@SomeToken......
  • Python multipart/form-data上传图片,包含file和其他参数的复杂情况
    我们先来看看multipart/form-data上传原理,如下图:   如上图,我们的请求头必须包含一个特殊的请求头信息:Content-Type,类型为:multipart/form-data,而且还要有一个内容分割符(boundary)用于分割请求体中的多个post的内容。因为接收方解析和还原文件必须要根据这个boundary......
  • Python multipart/form-data上传图片只有file一个参数的情况
    格式:multipart/form-data的基础方法是post,也就是说是由post方法来组合实现的,与post方法的不同之处:请求头,请求体。multipart/form-data的请求头必须包含一个特殊的头信息:Content-Type,且其值也必须规定为multipart/form-data,同时还需要规定一个内容分割符用于分割请求体中的多个......
  • day16 Python下的三元运算符
    Python下的三元运算符【一】引言三元表达式(三目运算符)能够简洁我们的代码三元表达式其实是将if...else...判断语句的简化表达,代替很多ifelse和if-else一样,只有一个表达式会被执行。因此,三元表达式中的if和else可以包含大量的计算,但只有True的分支会被执行在Java、C......
  • python selenium 下拉框处理
    在自动化测试中,处理下拉框(Dropdown)有以下几种方式:1.使用Select类:通过select的相关方法选择option选项select.select_by_index(index)参数index表示的option索引select.select_by_value(value)参数value表示的是option元属中value的属性值select.select_by_visible_te......