首页 > 编程语言 > 详细

【2020Python修炼记】面向对象编程——反射

时间:2020-04-15 18:12:31      阅读:63      评论:0      收藏:0      [点我收藏+]

【目录】

1、什么是反射

2、为何要用反射

3、如何实现反射

1、什么是反射

python是动态语言,而反射(reflection)机制被视为动态语言的关键

反射机制指的是在程序的运行状态中

对于任意一个类,都可以知道这个类的所有属性和方法;

对于任意一个对象,都能够调用他的任意方法和属性。

这种动态获取程序信息以及动态调用对象的功能称为反射机制

 

2、为何要用反射

为了动态获取程序信息以及动态调用对象。。

 

3、如何实现反射

(1)在python中实现反射非常简单,在程序运行过程中,如果我们获取一个不知道存有何种属性的对象,

若想操作其内部属性,可以先通过内置函数dir来获取任意一个类或者对象的属性列表,列表中全为字符串格式

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

    def say(self):
        print(<%s:%s> %(self.name,self.age))

obj=People(辣白菜同学,18)


# 实现反射机制的步骤
# 1、先通过多dir:查看出某一个对象下可以.出哪些属性来
print(dir(obj))

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


# 输出结果:
[__class__, __delattr__, __dict__, __dir__, __doc__, __eq__, __format__,

__ge__, __getattribute__, __gt__, __hash__, __init__, __init_subclass__,

__le__, __lt__, __module__, __ne__, __new__, __reduce__, __reduce_ex__,

__repr__, __setattr__, __sizeof__, __str__, __subclasshook__, __weakref__, age, name, say] 辣白菜同学

 

(2)接下来就是想办法通过字符串来操作对象的属性了,这就涉及到内置函数hasattr、getattr、setattr、delattr的使用了(Python中一切皆对象,类和对象都可以被这四个函数操作,用法一样) 

内置函数

hasattr()判断对象是否有该属性 

getattr()获取对象属性

setattr()修改对象属性 

delattr()删除对象属性

class Teacher:
    def __init__(self,full_name):
        self.full_name =full_name

t=Teacher(Egon Lin)

# hasattr(object,‘name‘)
hasattr(t,full_name) # 按字符串‘full_name‘判断有无属性t.full_name

# getattr(object, ‘name‘, default=None)
getattr(t,full_name,None) # 等同于t.full_name,不存在该属性则返回默认值None

# setattr(x, ‘y‘, v)
setattr(t,age,18) # 等同于t.age=18

# delattr(x, ‘y‘)
delattr(t,age) # 等同于del t.age

(3)应用——基于反射可以十分灵活地操作对象的属性,比如将用户交互的结果反射到具体的功能执行

obj=10
if hasattr(obj,x):
    print(getattr(10,x))
else:
    pass

print(getattr(obj,x,None))


if hasattr(obj,x):
    setattr(obj,x,111111111) # 10.x=11111
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()

# 运行结果:
# None
# >>>: put
# 正在执行上传功能
# 
# 进程已结束,退出代码 0

 

【2020Python修炼记】面向对象编程——反射

原文:https://www.cnblogs.com/bigorangecc/p/12703025.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!