python基础学习中要懂的知识点:反射机制

枫铃3年前 (2021-10-03)Python274

反射是什么

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

Python反射中的内置函数

getattr()

getattr():用于获取 对象中的属性 ,但是其不能获取 私有变量 也就是最前面带 __ 的属性或方法,getattr(object,name,default)其有三个参数

  • object :对象
  • name :对象中的属性值
  • 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

hasattr()

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

例子:

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
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

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))

delattr()

delattr(object,name)指删除对象中的指定属性,其中object是对象,name是对象中的属性名。

例子:

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
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反射中的四个内置函数。

python反射的应用

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

相关文章

Python3.8 新特性:仅位置参数

这是Python3.8新特性的第二篇,第一篇介绍了赋值表达式,这篇文章花几分钟了解什么是仅位置参数(Position...

python对象的 init 和 del 方法

对象的初始化方法__in...

Python:if判断与while、for循环语句

if判断 在代码命令中,经常会出现需要条件判断后后选择执行方向的情况,在通常情况下我们可以选择if条件判断。 if条件判断:...

Python for循环本质

Python for循环本质

我们先来看一下for循环的一些简单应用: ls=[1,2,3] for i in ls: print(i) 我们知道这样可以遍历地取出这...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。