python之反射

一、下列方法适用于类和对象

1.hasattr(object,name)

判断对象object中有没有name对应的方法或者属性    ##注意点name在括号中类型应为字符串类型

class A:

    def __init__(self, age):
        self.age = age
        print(age)

    def put_name(self):
        print('aa')


B = A('21')

a = hasattr(B, 'put_name')
b = hasattr(B, 'age')
print(a)
print(b)


输出为:
21
True
True

 

2.getattr(object, name, default=None) 

得到对象object中name对应的方法或者属性

class A:

    def __init__(self, age):
        self.age = age
        print(age)

    def put_name(self):
        print('aa')


B = A('21')


a = getattr(B, 'put_name')
print(type(a))
b = getattr(B, 'put_name')()


d = getattr(B, 'age')
print(d)
print(type(d))


输出内容;
21 
<class 'method'>
aa #执行put_name这个方法
21 #得到了age这个属性
<class 'str'>

 

3.setattr(object,attr,value)

创建object的新属性value

class A:

    def __init__(self, age):
        self.age = age
        print(age)

    def put_name(self):
        print('aa')


B = A('21')

setattr(B, 'name', 'sb') #name 是对象的属性,'sb' 是属性的值
print(B.name)


输出为:
21
sb

 

delattr(object,x)

将object中的属性删除

class A:

    def __init__(self, age):
        self.age = age
        print(age)

    def put_name(self):
        print('aa')


B = A('21')

setattr(B, 'name', 'sb') #name 是对象的属性,'sb' 是属性的值
print(B.name)
delattr(B, 'name')
print(B.__dict__)




输出:
21
sb
{'age': '21'} #属性中只剩下age

 

二.当前模块和不同模块之间的反射

1.反射当前模块的对象

import sys


def s1():
    print('s1')


def s2():
    print('s2')


this_module = sys.modules[__name__]

print(hasattr(this_module, 's1'))
print(getattr(this_module, 's2'))



输出:
True
<function s2 at 0x100e110d0>

 

2.反射其他模块的方法或类

 

文件 a.py
import sys

class A:
    def __init__(self, name):
        self.name = name
        pass
    def s1(self):
        print('s1')


    def s2(self):
        print('s2')

在同目录的b.py文件下

import a as fix

print(hasattr(fix, 'A'))

a = getattr(fix, 'A')('gao')


print(a.name)



输出:
<class 'a.A'>
True
gao
posted @ 2018-08-30 19:17  辉辉辉辉a  阅读(158)  评论(0编辑  收藏  举报