python对象反射和函数反射

[原文]

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

一.对象的反射

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

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

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

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参数来判断,是否有类的静态方法.也是可以的.因为对象的特殊性,先在对象中找是否有该成员,如果没在,通过对象指针,在去创建这个对象的类中找查

执行结果

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

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

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

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)

执行结果

1

2

3

19

+086

11

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

演示代码

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

执行结果

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‘

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

获取到对应的模块.

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

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

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

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

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)

执行结果

1

2

<module ‘lib.aa‘ from ‘D:\\python\\day10\\lib\\aa.py‘>

ait24

时间: 2024-10-13 02:38:55

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

Python系列之反射、函数

一.反射 说反射之前先介绍一下__import__方法,这个和import导入模块的另一种方式 1. import commons 2. __import__('commons') 如果是多层导入: 1. from list.text import commons 2. __import__(' list.text.commons',fromlist=True) #如果不加上fromlist=True,只会导入list目录 反射有即想到4个内置函数分别为:getattr.hasattr.seta

8.python之面相对象part.6(反射&__call__,__setattr__,__delattr__,__getattr__)

一.什么是反射? 反射,又被称为自省,主要是指程序本身可以访问,检测,和修改"自己",状态或行为的一种能力. 二.python是如何体现这种反射机制的? 通过字符串去操作对象相关的属性,python中,一切皆对象,所有的地方都可以用到反射. python内部提供了四个实现反射(自省)的函数,这四个函数可以适用于任何的类和对象(这是因为类本身也是一个对象!) 1.hasattr(object,str) 用来检测一个对象中是否有某个字符串对应的方法或者属性. 例如: l1 = [] pri

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

目录 Python - 面对对象(其他相关,异常处理,反射,等..) 一.isinstance(obj, cls) 二.issubclass(sub, super) 三.异常处理 1. 异常处理 2.异常种类 3.异常其他结构 4.主动触发异常 5.自定义异常 6.断言 四.反射 五. 单例模式 Python - 面对对象(其他相关,异常处理,反射,等..) 一.isinstance(obj, cls) 检查是否obj是否是类 cls 的对象 class Foo(object): pass ob

一箭三雕(1) - Python, C#, Java 中的反射

学习反射时需要了解的概念 程序的结构 (namespace, module, package) 了解反射的意义和缺点 1. Python  : 关键字 : getattr(), inspect python程序是基于module的, 当你需要动态加载一个module时,就需要 用到__import(modulename)__方法, 然后利用getattr(module,attribute,[default]) 方法去获取一个module下的方法成员. 例如 , module = __import

Go - 反射中 函数 和 方法 的调用

上一篇文章 说到了 Golang 中的反射的一些基本规则,重点就是文章中最后的三点,但是这篇文章并没有说如何在反射中调用函数和方法,这就是接下来要说的. 反射中调用 函数 众所周知,Golang 中的函数是可以像普通的 int.float 等类型变量那样作为值的,例如: package main import "fmt" func hello() { fmt.Println("Hello world!") } func main() { hl := hello hl

【python之路30】反射

一.反射 1.反射的基本介绍: 反射是所有程序的专有名词,在java,C#语言中都存在反射,那么什么是反射呢? python中 的反射概括来说:是通过字符串的形式导入模块,并通过字符串的形式去模块中寻找函数并执行. 例如: 根据用户输入的模块名(input)来导入模块: #!usr/bin/env python # -*- coding:utf-8 -*- modue = input('请输入您要导入的模块名:') RE = __import__(modue) #相当于执行:import re

python 学习笔记day03-python基础、python对象、数字、函数

python基础 语句和语法 注释及续行 首要说明的是:尽管python可读性最好的语言之一,这并不意味者程序员在代码中就可以不写注释 和很多UNIX脚本类似,python注释语句从#字符开始 注释可以在一行的任何地方开始,解释器会忽略掉该行#之后的所有内容 一行过长的语句可以使用反斜杠\分解成几行 缩进及代码组 缩进相同的一组语句构成一个代码块,称之为代码组 首行以关键字开始,以冒号:结束,该行之后的一行或多行代码构成代码组 如果代码组只有一行,可以将其直接写在冒号后面,但是这样的写法可读性差

python之旅:函数对象、函数嵌套、名称空间与作用域、装饰器

一.函数对象 函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 #3 返回值可以是函数 #3 可以当作容器类型的元素 # 利用该特性,优雅的取代多分支的if 二.函数嵌套 三.名称空间与作用域 四丶装饰器 原文地址:https://www.cnblogs.com/moyand/p/8667266.html

python学习笔记之——函数模块

1.函数参数说明: def login(name,info,passwd = '123456') 函数参数可以有默认值,调用函数时: 1.如果只传二个参数,则有默认值的一定要放到最后: def login(name,passwd = '123456',info='welcome to you') 2.如果传二个参数,一定要指明形参: login(user) login(user,passwd) login(user,info='欢迎') login(user,info='欢迎',passwd='