python面向对象进阶之反射机制(简述)

首先大家应该知道python是一个强类型的动态解释型语言

动态的定义:当程序运行时才会为对象定义数据类型

一、什么是反射: 

指的是程序运行过程中可以动态(在程序运行时)获取对象的信息

二、为何要用反射:

 Python是一门动态语言,只有在程序运行时才能知道数据的类型及对象包含的属性和方法,比如:

def func(obj):
    return obj.x#当调用传入一个obj对象时,首先要判断该对象是否包含‘x’这个属性

func(10)# 若随意传入一个值时则会报错

# 思路(以下代码肯定是会报错的,但思路是对的):

def func(obj):
    if 'x' not in obj.__dict__:#应当判断是否含有'x'这个属性
        return None
    return obj.x
func(10)

三、实现反射机制的步骤(原理)

class P:
    def __init__(self, age, name):
        self.name = name
        self.age = age

    def say(self):
        print(self.name,self.age)
obj = P(18, 'egon')

# 1、先通过dir:查看某一个对象下可以.出哪些属性来
print(dir(obj))

# 2、可以通过字符串反射到真正的属性上,得到属性值
print(obj.__dict__[dir(obj)[-2]])# obj. age=====》原理

简单介绍四个内置函数:通过字符串来操作属性值

hasattr()# 判断对象是否存在
print(hasattr(obj,'name'))

getattr()# 获取属性
print(getattr(obj,'name'))

setattr()# 为属性赋值
print(setattr(obj,'name','egon'))
print(obj.name)

delattr()# 删除属性
delattr(obj,'name')

补充1:

res1=getattr(obj,'say')# 也可通过字符串操作方法
res2=getattr(P,'say')
print(res2)
print(res1)

#输出结果为:
<function P.say at 0x0000021618C98E50>
<bound method P.say of <__main__.P object at 0x00000216080E12B0>>

补充2:

print(hasattr(10, 'x'))  # 查看10下是否有属性x
print(getattr(10, 'x', None))  # 指定一个默认参数 None(当获取不到属性时,返回一个指定参数)

obj=10
if hasattr(obj,'x'):# 判断obj是否含有x属性
    getattr(obj,'x')# 若存在获取 obj.x的属性值
else:
    print('不存在x属性')

if hasattr(obj,'x'):
    setattr(obj,'x',20)# 若存在为obj.x属性赋值==》obj.x=20
else:
    pass

反射小案例:

class Ftp:
    def put(self):
        print('正在执行上传功能')

    def get(self):
        print('正在执行下载功能')

    def interactive(self):
        method=input('>>>>>').strip()# 如:method='put'

        if hasattr(self,method):
            getattr(self,method)()
        else:
            print('输入的指令不存在')

obj=Ftp()
obj.interactive() 

# 运行结果1:
>>>>>sssss
输入的指令不存在

# 运行结果2
>>>>>put
正在执行上传功能

这是我看了林海峰老师视频的总结,若有补充或错误,欢迎大佬们指出。

上一篇:【故障处理】imp-00051,imp-00008


下一篇:如何通过懒属性来提升 Python 性能