####反射预备知识一###########
__call__ 对象后面加括号,触发执行。
python中,类的默认的内置方法,有一个名为__call__,如
class foo:
def __init__(self):
pass
def __call__(self,*args,**kwargs)
print '__call__'
调用:
obj = Foo() #执行'__init__'
obj()'#执行__call__'
####反射预备知识二###########
在python中,obj是通过Foo类实例化的对象,
其实,不仅 obj 是一个对象,Foo类本身也是一个对象,因为在Python中一切事物都是对象。
如果按照一切事物都是对象的理论:obj对象是通过执行Foo类的构造方法创建,那么Foo类对象应该也是通过执行某个类的 构造方法 创建。
证据:
print type(obj) #输出<class 'Demo.foo'> 表示,obj对象由类Foo类创建
print type(Foo) #输出<type 'type'> 表示,Foo类对象 由Type类创建
####反射预备知识三###########
类的特殊创建方式:
def func(self):
#todo
def __init__(self ,name,age):
self.name = name
self.age= age
Foo = type('Foo',{object,},{'func':func,'__init__':__init__})
调用:
obj = Foo("aaa",22)
obj.func()
#type第一个参数:类名
#type第二个参数:当前类的基类
#type第三个参数:类的成员
类 是由 type 类实例化产生
####反射预备知识三###########
Type类型猜想:
class MyType(type):
def __init__(self,what,bases=None,dict=None): #类名,基类,类成员
super(MyType,self).__init__(what,bases,dict)
def __call_(self,*args,**kwargs)
obj = self.__new__(self,*args,**kwargs)
self.__init__(obj)
class Foo(object):
__metaclass__=MyTpe #内置内属性,指定其 元 类
def __init__(self,name):
self.nam =name
def __new__(cls,*arg,**kwargs):
return object.__new__(cls,*args,**kwargs)
那么,在使用 obj =Foo(),时,将发生以下反应:
1. MyType使用 自己的__init__方法,产生 Foo类
2. 根据Foo(),在Type看来,Foo类也是一个对象,根据 “ 反射预备知识一” 可知,使用Foo(),相当于
执行__call__()
3.__call__中,又执行了Foo类的__new__ 和 __init__ ,以达到创建对象的目的
####反射预备知识四###########
# #### 检查是否含有成员 #### hasattr(obj, 'name') hasattr(obj, 'func') # #### 获取成员 #### getattr(obj, 'name') getattr(obj, 'func') # #### 设置成员 #### setattr(obj, 'age', 18) setattr(obj, 'show', lambda num: num + 1) # #### 删除成员 #### delattr(obj, 'name') delattr(obj, 'func')
反射:
1.获取某个目录下的所有.py文件名
2.使用 f = __import__("import_lib.fileName") *注意,Python中,一切皆对象,连模块都是对象
3. if hasattr(f, '根据约定的接口类名(例如:PlugIn)') : #假如Plugin是由url中截取到的话,就是对应的页面模块了
PlugIn = getattr(f,"PlugIn")
instance = Plugin()
#todo