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

【目录】

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

 

posted @ 2020-04-15 17:40  bigorangecc  阅读(296)  评论(0编辑  收藏  举报