python对象反射和函数反射
python的对象反射功能,经常在编程时使用.相比较其它的编程语言使用非常方便.反射就是用字符串来操作对象或者类,模块中的成员.

一.对象的反射
反射功能的实现,由这4个内置函数来实现(hasattr, getattr, setattr, delattr)
1.1.hasattr判断是否有某个成员
判断对象中是否有属性, 方法.返回bool值
# -*-coding:utf-8-*-
class Foo(object):
country = "china"
def __init__(self, name):
self.name = name
def f(self):
print "function f"
obj = Foo("abc")
print hasattr(obj, "name") #判断是否有name字段,返回True
print hasattr(obj, "f") #判断是否有f方法,返回True
print hasattr(obj, "ok") #没有这个方法,返回False
print hasattr(obj, "country") #判断有没有静态字段,返回True
print hasattr(Foo, "country") #使用类作为参数来判断
print "class:", Foo.__dict__.keys()
print "obj:", obj.__dict__.keys()
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
#!/usr/bin/env python
# -*-coding:utf-8-*-
class Foo(object):
country = "china"
def __init__(self, name):
self.name = name
def f(self):
print "function f"
obj = Foo("abc")
print hasattr(obj, "name") #判断是否有name字段,返回True
print hasattr(obj, "f") #判断是否有f方法,返回True
print hasattr(obj, "ok") #没有这个方法,返回False
print hasattr(obj, "country") #判断有没有静态字段,返回True
print hasattr(Foo, "country") #使用类作为参数来判断
print "class:", Foo.__dict__.keys()
print "obj:", obj.__dict__.keys()
|
上例中使用对象作为obj参数来判断,是否有类的静态方法.也是可以的.因为对象的特殊性,先在对象中找是否有该成员,如果没在,通过对象指针,在去创建这个对象的类中找查
执行结果
True
False
True
True
class: ['__module__', 'f', 'country', '__dict__', '__weakref__', '__doc__', '__init__']
obj: ['name']
|
1
2
3
4
5
6
7
|
True
True
False
True
True
class: ['__module__', 'f', 'country', '__dict__', '__weakref__', '__doc__', '__init__']
obj: ['name']
|
1.2.获取对象的成员
也可以使用对象来获取类的成员.和上例中的hasattr一样
# -*-coding:utf-8-*-
class Foo(object):
country = "china"
def __init__(self, name):
self.name = name
def f(self):
print "this is function = ", self.name
obj = Foo("abc")
print getattr(obj, "name") #获取对象的name字段
f = getattr(obj, "f") #通过对象获取类的方法
print f #打印出来是信类的方法
f() #加上括号就能直接调用执行这个的方法
print getattr(Foo, "country")
print getattr(obj, "country") #使用对象也能找到静态字段
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#!/usr/bin/env python
# -*-coding:utf-8-*-
class Foo(object):
country = "china"
def __init__(self, name):
self.name = name
def f(self):
print "this is function = ", self.name
obj = Foo("abc")
print getattr(obj, "name") #获取对象的name字段
f = getattr(obj, "f") #通过对象获取类的方法
print f #打印出来是信类的方法
f() #加上括号就能直接调用执行这个的方法
print getattr(Foo, "country")
print getattr(obj, "country") #使用对象也能找到静态字段
|
1.3.增加对象或者类的成员
动态的增加对象或者类中的成员
# -*-coding:utf-8-*-
class Foo(object):
country = "china"
def __init__(self, name):
self.name = name
def f(self):
print "this is function f.name = ", self.name
obj = Foo("abc")
setattr(obj, "age", 19) #增加普通字段
setattr(obj, "show", lambda num: num +1) #增加普通方法
setattr(Foo, "tel", "+086") #增加静态字段
print obj.age
print Foo.tel
print obj.show(10)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
#!/usr/bin/env python
# -*-coding:utf-8-*-
class Foo(object):
country = "china"
def __init__(self, name):
self.name = name
def f(self):
print "this is function f.name = ", self.name
obj = Foo("abc")
setattr(obj, "age", 19) #增加普通字段
setattr(obj, "show", lambda num: num +1) #增加普通方法
setattr(Foo, "tel", "+086") #增加静态字段
print obj.age
print Foo.tel
print obj.show(10)
|
执行结果
+086
11
|
1
2
3
|
19
+086
11
|
1.4.使用delattr动态的删除类或者方法成员
演示代码
# -*-coding:utf-8-*-
class Foo(object):
country = "china"
def __init__(self, name):
self.name = name
def f(self):
print "this is function f.name = ", self.name
obj = Foo("abc")
print getattr(obj, "name")
delattr(obj, "name") #删除掉了对象的普通字段name
print getattr(obj, "name")
print getattr(Foo, "country")
delattr(Foo, "country") #删除掉类的静态字段
print getattr(Foo, "country") #打印时说找不到些成员,报错
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
#!/usr/bin/env python
# -*-coding:utf-8-*-
class Foo(object):
country = "china"
def __init__(self, name):
self.name = name
def f(self):
print "this is function f.name = ", self.name
obj = Foo("abc")
print getattr(obj, "name")
delattr(obj, "name") #删除掉了对象的普通字段name
print getattr(obj, "name")
print getattr(Foo, "country")
delattr(Foo, "country") #删除掉类的静态字段
print getattr(Foo, "country") #打印时说找不到些成员,报错
|
执行结果
File "D:/����/python/��������/day08/blog/fanshe.py", line 17, in <module>
abc
print getattr(obj, "name")
AttributeError: 'Foo' object has no attribute 'name'
|
1
2
3
4
5
|
Traceback (most recent call last):
File "D:/����/python/��������/day08/blog/fanshe.py", line 17, in <module>
abc
print getattr(obj, "name")
AttributeError: 'Foo' object has no attribute 'name'
|
二.在当前模块中使用反射
获取到对应的模块.
# -*-coding:utf-8-*-
import sys
data = "abc"
def f1():
print "f1 function"
def f2():
print "f2"
this_module = sys.modules[__name__]
print hasattr(this_module, "data") #使用反射
f1_get = getattr(this_module, "f1") #使用反射获取
f1_get()
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#!/usr/bin/env python
# -*-coding:utf-8-*-
import sys
data = "abc"
def f1():
print "f1 function"
def f2():
print "f2"
this_module = sys.modules[__name__]
print hasattr(this_module, "data") #使用反射
f1_get = getattr(this_module, "f1") #使用反射获取
f1_get()
|
以上是反射对类,对象,模块成员操作的基本方法.
三.使用字符串自动导入模块
依据传入的字符串,自动导入模块.类似上文的方法反射
my_moudle_name = "lib.aa"
aa = importlib.import_module(my_moudle_name)
print(aa)
print(aa.C().name)
|
1
2
3
4
5
6
7
|
import importlib
my_moudle_name = "lib.aa"
aa = importlib.import_module(my_moudle_name)
print(aa)
print(aa.C().name)
|
执行结果
ait24
|
1
2
|
<module 'lib.aa' from 'D:\\python\\day10\\lib\\aa.py'>
ait24
|
python对象反射和函数反射的更多相关文章
- python记录_day18 反射 判断函数与方法
一.三个内置函数 1.issubclass(a, b) 判断a类是否是b类的子类 class Foo: pass class Zi(Foo): pass class Sun(Zi): pass pr ...
- Python面试题之Python对象反射、类反射、模块反射
python面向对象中的反射:通过字符串的形式操作对象相关的属性.python中的一切事物都是对象(都可以使用反射) 一.getattr 对象获取 class Manager: role = &quo ...
- python开发面向对象进阶:反射&内置函数
isinstance和issubclass isinstance(obj,cls)检查是否obj是否是类 cls 的对象或者子类的对象 class Foo(object): pass class ba ...
- Python - 面对对象(其他相关,异常处理,反射,单例模式,等..)
目录 Python - 面对对象(其他相关,异常处理,反射,等..) 一.isinstance(obj, cls) 二.issubclass(sub, super) 三.异常处理 1. 异常处理 2. ...
- Python学习日记(二十七) 反射和几个内置函数
isinstance() 判断isinstance(obj,cls)中obj是否是cls类的对象 class Person: def __init__(self,name): self.name = ...
- Python面向对象06 /元类type、反射、函数与类的区别、特殊的双下方法
Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 目录 Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 1. 元类type 2. 反射 3 ...
- python 面向对象专题(六):元类type、反射、函数与类的区别、特殊的双下方法
目录 Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 1. 元类type 2. 反射 3. 函数与类的区别 4. 特殊的双下方法 1. 元类type type:获取对象 ...
- python基础之 面向对象之反射
1.isinstance和issubclass issubclass(Son,Foo) 判断雷与类之间的是否有继承关系,接受两个参数,一个是疑似子类,一个是疑似父类,判断Son是否是Foo的子类 ob ...
- 百万年薪python之路 -- 面向对象之 反射,双下方法
面向对象之 反射,双下方法 1. 反射 计算机科学领域主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省) python面向对象中的反射:通过字符串的形式操作对象相关的属性.python ...
随机推荐
- nginx介绍和安装
1.nginx的介绍 1.1 nginx的优势 1) 作为Web服务器,Nginx处理静态文件.索引文件,自动索引的效率非常高. 2) 作为代理服务器,Nginx可以实现无缓存的反向代理加速,提高网站 ...
- delphi 10 Seattle 第一个Android程序
delphi 10 Seattle 第一个Android程序 1.打开Delphi RAD Studio Seattle,如下图 2.选择black application 点击OK 3. ...
- 5-4 import,export属性
一.默认 export default 匿名的方法 这种导出的方式不需要知道变量的名字, 相当于是匿名的, 直接把开发的接口给export:如果一个js模块文件就只有一个功能, 那么就可以使用expo ...
- Altium Designer 输出 gerber 光绘文件的详细说明
Altium Designer 输出 gerber 光绘文件的详细说明 PCB画好后,我们需要输出光绘文件交给制版厂家.由此,输出光绘文件的重要性就显出来了. 先复习一下介绍各层的定义吧,哈哈 (1) ...
- python nose测试框架全面介绍四
四.内部插件介绍 1.Attrib 标记,用于筛选用例 在很多时候,用例可以分不同的等级来运行,在nose中很增加了这个功能,使用attrib将用例进行划分 有两种方式: ef test_big_do ...
- windows下的C++与cuda编译器位置
在windows下最常见的C++编译器为visual studio自带的编译器cl.exe 通常其所在目录为: C:\Program Files (x86)\Microsoft Visual Stud ...
- Git - 使用BitBucket和SourceTree进行源代码管理遇到POST git-receive-pack (chunked)
我使用的是SourceTree Mac版,提交到BitBucket时出现 一直处于 POST git-receive-pack (chunked) 状态,经过百度,解决问题 在使用SourceTre ...
- iOS - 视频开发
视频实质: 纯粹的视频(不包括音频)实质上就是一组帧图片,经过视频编码成为视频(video)文件再把音频(audio)文件有些还有字幕文件组装在一起成为我们看到的视频(movie)文件.1秒内出现的图 ...
- ubuntu下绝对路径和相对路径的问题
绝对路径与相对路径 除了需要特别注意的FHS目录配置外,在文件名部分我们也要特别注意.因为根据档名写法的不同,也可将所谓的路径(path)定义为绝对路径(absolute)与相对路径(relativ ...
- Blocks POJ - 1390 多维dp
题意:有一排box,各有不同的颜色.你可以通过点击某个box使得与其相邻的同色box全部消掉,然后你可以得到的分数为消去长度的平方,问怎样得到最高分? 题解:考虑用一维dp,/*dp[i]为1~i个b ...