面向对象------------------------------反射(面向对象的又一个思路)

对 对象的反射

hasattr(obj,'属性名/函数名')#检查是不是有

getattr(obj,'属性名/函数名')#获取属性名或函数名****对象反射得到的函数()进行调用时候不用传入对象这个参数

setattr(obj,'属性名',返回值)#设置属性使得obj.'属性名‘ = 返回值

setattr(obj,'函数名',函数:(lambda self(返回值):self.name+'sb'))#设置属性使得obj.'函数名‘ = 函数

delattr(obj,'属性')#删除对象属性

delattr(obj,'函数名')#删除对象函数

class Foo:

f = '类的静态变量'

def init(self,name,age):

self.name=name

self.age=age

def say_hi(self):

print('hi,%s'%self.name)

obj=Foo('egon',73)

#检测是否含有某属性

print(hasattr(obj,'name'))

print(hasattr(obj,'say_hi'))

#获取属性

n = getattr(obj,'name')

print(n)

func = getattr(obj,'say_hi')

func()

print(getattr(obj,'aaaaaaaa','不存在啊')) #报错

#设置属性

setattr(obj,'sb',True)

setattr(obj,'show_name',lambda self:self.name+'sb')

print(obj.__dict__)

print(obj.show_name(obj))

#删除属性

delattr(obj,'age')

delattr(obj,'show_name')

# delattr(obj,'show_name111')#不存在,则报错

print(obj.__dict__)

类 的反射

getattr(Class, '属性')

getattr(Class, '方法名')

getattr(Class, '静态方法')

getattr(Class, '_Class+私有方法名')

getattr(Class, '_Class+私有属性名')

print(getattr(Foo, 'aaa')()) # 这个不明白为什么不传参数??????????????????????

class Foo(object):

staticField = "old boy"

__aaa = '2222'

def init(self):

self.name = 'wupeiqi'

def func(self):

return 'func'

@staticmethod

def bar():

return 'bar'

def __add(self):

return '__add'

@classmethod

def aaa(cls):

return 'aaa'

a = Foo()

print(getattr(Foo, 'staticField'))#属性可以反射拿到

print(getattr(Foo, '_Foo__aaa'))#属性可以反射拿到

print(getattr(Foo, 'func')(Foo))#方法可以反射拿到

print(getattr(Foo, 'bar')())# 静态方法 也可以找

print(getattr(Foo, '_Foo__add')(Foo)) #类和对象都能去调用这个类的私有方法(首先是找到私有方法)

print(getattr(Foo, 'aaa')()) # 这个不明白为什么不传参数??????????????????????

import sys

def s1():

print('s1')

def s2():

print('s2')

this_module = sys.modules[name]

print(this_module)

hasattr(this_module, 's1')()

getattr(this_module, 's2')()

# 一个模块中的代码

def test():

print('from the test')

"""

程序目录:

module_test.py

index.py

当前文件:

index.py

"""

# 另一个模块中的代码

import module_test as obj

# obj.test()

print(hasattr(obj, 'test'))

getattr(obj, 'test')()

猜你喜欢

转载自www.cnblogs.com/wing3993/p/11392322.html