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

一.对象的反射

反射功能的实现,由这4个内置函数来实现(hasattr, getattr, setattr, delattr)

1.1.hasattr判断是否有某个成员

判断对象中是否有属性, 方法.返回bool值

#!/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()

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
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一样

#!/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
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.增加对象或者类的成员

动态的增加对象或者类中的成员

#!/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)

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)

执行结果

19
+086
11
1
2
3
19
+086
11

1.4.使用delattr动态的删除类或者方法成员

演示代码

#!/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") #打印时说找不到些成员,报错

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")            #打印时说找不到些成员,报错

执行结果

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'
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'

二.在当前模块中使用反射

获取到对应的模块.

#!/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()

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()

以上是反射对类,对象,模块成员操作的基本方法.

三.使用字符串自动导入模块

依据传入的字符串,自动导入模块.类似上文的方法反射

import importlib

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)

执行结果

<module 'lib.aa' from 'D:\\python\\day10\\lib\\aa.py'>
ait24
1
2
<module 'lib.aa' from 'D:\\python\\day10\\lib\\aa.py'>
ait24

python对象反射和函数反射的更多相关文章

  1. python记录_day18 反射 判断函数与方法

    一.三个内置函数 1.issubclass(a, b)  判断a类是否是b类的子类 class Foo: pass class Zi(Foo): pass class Sun(Zi): pass pr ...

  2. Python面试题之Python对象反射、类反射、模块反射

    python面向对象中的反射:通过字符串的形式操作对象相关的属性.python中的一切事物都是对象(都可以使用反射) 一.getattr 对象获取 class Manager: role = &quo ...

  3. python开发面向对象进阶:反射&内置函数

    isinstance和issubclass isinstance(obj,cls)检查是否obj是否是类 cls 的对象或者子类的对象 class Foo(object): pass class ba ...

  4. Python - 面对对象(其他相关,异常处理,反射,单例模式,等..)

    目录 Python - 面对对象(其他相关,异常处理,反射,等..) 一.isinstance(obj, cls) 二.issubclass(sub, super) 三.异常处理 1. 异常处理 2. ...

  5. Python学习日记(二十七) 反射和几个内置函数

    isinstance() 判断isinstance(obj,cls)中obj是否是cls类的对象 class Person: def __init__(self,name): self.name = ...

  6. Python面向对象06 /元类type、反射、函数与类的区别、特殊的双下方法

    Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 目录 Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 1. 元类type 2. 反射 3 ...

  7. python 面向对象专题(六):元类type、反射、函数与类的区别、特殊的双下方法

    目录 Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 1. 元类type 2. 反射 3. 函数与类的区别 4. 特殊的双下方法 1. 元类type type:获取对象 ...

  8. python基础之 面向对象之反射

    1.isinstance和issubclass issubclass(Son,Foo) 判断雷与类之间的是否有继承关系,接受两个参数,一个是疑似子类,一个是疑似父类,判断Son是否是Foo的子类 ob ...

  9. 百万年薪python之路 -- 面向对象之 反射,双下方法

    面向对象之 反射,双下方法 1. 反射 计算机科学领域主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省) python面向对象中的反射:通过字符串的形式操作对象相关的属性.python ...

随机推荐

  1. nginx介绍和安装

    1.nginx的介绍 1.1 nginx的优势 1) 作为Web服务器,Nginx处理静态文件.索引文件,自动索引的效率非常高. 2) 作为代理服务器,Nginx可以实现无缓存的反向代理加速,提高网站 ...

  2. delphi 10 Seattle 第一个Android程序

    delphi 10 Seattle 第一个Android程序 1.打开Delphi RAD Studio Seattle,如下图     2.选择black application 点击OK   3. ...

  3. 5-4 import,export属性

    一.默认 export default 匿名的方法 这种导出的方式不需要知道变量的名字, 相当于是匿名的, 直接把开发的接口给export:如果一个js模块文件就只有一个功能, 那么就可以使用expo ...

  4. Altium Designer 输出 gerber 光绘文件的详细说明

    Altium Designer 输出 gerber 光绘文件的详细说明 PCB画好后,我们需要输出光绘文件交给制版厂家.由此,输出光绘文件的重要性就显出来了. 先复习一下介绍各层的定义吧,哈哈 (1) ...

  5. python nose测试框架全面介绍四

    四.内部插件介绍 1.Attrib 标记,用于筛选用例 在很多时候,用例可以分不同的等级来运行,在nose中很增加了这个功能,使用attrib将用例进行划分 有两种方式: ef test_big_do ...

  6. windows下的C++与cuda编译器位置

    在windows下最常见的C++编译器为visual studio自带的编译器cl.exe 通常其所在目录为: C:\Program Files (x86)\Microsoft Visual Stud ...

  7. Git - 使用BitBucket和SourceTree进行源代码管理遇到POST git-receive-pack (chunked)

    我使用的是SourceTree Mac版,提交到BitBucket时出现 一直处于 POST git-receive-pack (chunked)  状态,经过百度,解决问题 在使用SourceTre ...

  8. iOS - 视频开发

    视频实质: 纯粹的视频(不包括音频)实质上就是一组帧图片,经过视频编码成为视频(video)文件再把音频(audio)文件有些还有字幕文件组装在一起成为我们看到的视频(movie)文件.1秒内出现的图 ...

  9. ubuntu下绝对路径和相对路径的问题

     绝对路径与相对路径 除了需要特别注意的FHS目录配置外,在文件名部分我们也要特别注意.因为根据档名写法的不同,也可将所谓的路径(path)定义为绝对路径(absolute)与相对路径(relativ ...

  10. Blocks POJ - 1390 多维dp

    题意:有一排box,各有不同的颜色.你可以通过点击某个box使得与其相邻的同色box全部消掉,然后你可以得到的分数为消去长度的平方,问怎样得到最高分? 题解:考虑用一维dp,/*dp[i]为1~i个b ...