Python语言反射之我见

在计算机科学中,反射(英语:reflection)是指计算机程序在运行时(runtime)可以访问、检测和修改它本身状态或行为的一种能力。[1]用比喻来说,反射就是程序在运行的时候能够“观察”并且修改自己的行为。

反射技术一般在框架中用得非常多,比如各种WEB框架Django等…

直接上一个例子吧

class Person(object):
    grade = 10

    def __init__(self):
        pass

    def info(self):
        print('我是person类的info方法')

# getattr() 根据字符串去某个对象中属性
inst = Person()
func = getattr(inst, 'info')
func()

# hasattr() 根据字符串判断某个对象中该属性是否存在
print(hasattr(inst, 'info'))
print(hasattr(inst, 'grade'))

# setattr() 根据字符串去某个对象中设置属性
setattr(inst, 'name', 'moddemod')
r = hasattr(inst, 'name')
print(r)
name = getattr(inst, 'name')
print(name)

# delattr() 根据字符串去某个对象中属性
delattr(inst, 'name')
print(hasattr(inst, 'name'))

这里你主要理解一个东西,就是你传入的是一个字符串,但是结果返回的确实代码的执行结果

即 字符串 -> 运行代码 这样一种映射

反射就是这样一种表现形式,

可能很难理解,通常情况下,虽然Python是一门解释型动态语言,但是到CPU上执行的时候一定是硬编码,也就是所谓的二进制,对于我们所编写的代码部分,我们从最高层看到一堆的字母数字各种变量函数,但是到CPU上是没有这些东西的。

本来我们写代码的时候正常情况下,一个函数是需要先定义后才能调用的,而且定义调用的过程都是代码部分写死的

# 定义
def func():
	print('call...')

# 调用
func()

但是通过反射机制,我们可以在程序运行时传入一个字符串’func’,就可以拿到func这个函数对象,进而可以调用该函数。

关于这里拿到的属性如果是函数可以直接调用,涉及到动态语言的鸭子类型

“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”
所谓的鸭子类型

鸭子类型(英语:duck typing)在程序设计中是动态类型的一种风格。

在鸭子类型中,关注点在于对象的行为,能作什么;而不是关注对象所属的类型。

鸭子类型通常得益于"不"测试方法和函数中参数的类型,而是依赖文档、清晰的代码和测试来确保正确使用。

简而言之就是,你完全也可以拿到一个普通属性就直接调用,Python语法也不会报错,但是在运行的时候肯定是过不去的。它就是不在乎你是什么东西(语法不报错),而在乎你能做什么(运行报错,因为你做不了这个事)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值