首页 > 代码库 > python-面向对象进阶

python-面向对象进阶

一、什么是反射

  反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。

 

二、四个可以实现自省的函数(下列方法适用于类和对象)

1、hasattr(object,name)

判断object中有没有一个name字符串对应的方法或属性

2、getattr(object, name, default=None)

3、setattr(x, y, v)

4、delattr(x, y)

 

示例:

 1 class BlackMedium:
 2     feature=Ugly
 3     def __init__(self,name,addr):
 4         self.name=name
 5         self.addr=addr
 6 
 7     def sell_house(self):
 8         print(%s 黑中介卖房子啦,傻逼才买呢,但是谁能证明自己不傻逼 %self.name)
 9     def rent_house(self):
10         print(%s 黑中介租房子啦,傻逼才租呢 %self.name)
11 
12 b1=BlackMedium(万成置地,回龙观天露园)
13 
14 #检测是否含有某属性
15 print(hasattr(b1,name))
16 print(hasattr(b1,sell_house))
17 
18 #获取属性
19 n=getattr(b1,name)
20 print(n)
21 func=getattr(b1,rent_house)
22 func()
23 
24 # getattr(b1,‘aaaaaaaa‘) #报错
25 print(getattr(b1,aaaaaaaa,不存在啊))
26 
27 #设置属性
28 setattr(b1,sb,True)
29 setattr(b1,show_name,lambda self:self.name+sb)
30 print(b1.__dict__)
31 print(b1.show_name(b1))
32 
33 #删除属性
34 delattr(b1,addr)
35 delattr(b1,show_name)
36 #delattr(b1,‘show_name111‘)#不存在,则报错
37 
38 print(b1.__dict__)

执行结果:

1 True
2 True
3 万成置地
4 万成置地  黑中介房子啦,傻逼才租呢
5 不存在啊
6 {name: 万成置地, show_name: <function <lambda> at 0x01142F60>, sb: True, addr: 回龙观天露园}
7 万成置地sb

 

三、为什么用反射

有俩程序员,一个alex,一个是egon,alex在写程序的时候需要用到egon所写的类,但是egon去跟女朋友度蜜月去了,还没有完成他写的类,alex想到了反射,使用了反射机制alex可以继续完成自己的代码,等egon度蜜月回来后再继续完成类的定义并且去实现alex想要的功能。

总之反射的好处就是,可以事先定义好接口,接口只有在被完成后才会真正执行,这实现了即插即用,这其实是一种‘后期绑定’,什么意思?即你可以事先把主要的逻辑写好(只定义接口),然后后期再去实现接口的功能

 

 

四、动态导入模块

1、新建一个t.py的文件

1 print(---------------->)
2 def test1():
3     print(test1)
4 
5 def _test2():
6     print(test2)

2、再创建:m1文件夹,再在他下面创建一个t.py

 1 module_t=__import__(m1.t)
 2 print(module_t)
 3 module_t.t.test1()
 4 # from m1.t import *
 5 # from m1.t import test,_test2
 6 
 7 import importlib
 8 m=importlib.import_module(m1.t)
 9 print(m)
10 m.test1()
11 m._test2()

执行结果:

1 ---------------->
2 <module m1 (namespace)>
3 test1
4 <module m1.t from D:\\python\\day26\\m1\\t.py>
5 test1
6 test2

 

python-面向对象进阶