学习笔记63_python反射
####反射预备知识一###########
__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
最新文章
- 理解Docker(5):Docker 网络
- Socket通信类
- bash的管道符与重定向
- Gym - 101102C
- [LeetCode] Reverse Linked List
- 关于自定义Dialog的一次折腾
- python使用SMTP发送邮件
- linux命令之crontab详解
- 使用WinDBG调试查看C#内存转储文件
- jquery validate 动态增加删除验证规则(转载)
- Rancher学习笔记-----1.分享链接
- ORA-03137: TTC 协议内部错误: [12333] [4] [49] [51] [] [] [] []
- WebService发布到IIS
- Oracle性能优化2- 依据场景选择技术
- 定时任务起的java进程没有释放导致oracle的问题not availavle &; out of memory
- 《mysql必知必会》学习_第六章_20180730_欢
- QTP Test ,VAPI-XP Test,LR Test 和ALM 集成远程分布式执行遇到的&ldquo;access is denied &rdquo; &ldquo;unspecified error&rdquo;问题
- StormUI详解
- 【Java面试题】28 简述synchronized和java.util.concurrent.locks.Lock的异同 ?
- [转]How do I run msbuild from the command line using Windows SDK 7.1?