反射的认识
一、反射中几个重要词的认识
- 1、
hasattr(object, name)
判断对象是否有该属性 - 2、
getattr(object, name, default=None)
获取对象属性 - 3、
setattr(x, y, v)
设置属性 - 4、
delattr(x, y)
删除属性
二、使用上面几个方法
class Animal(object):
def __init__(self, name, age):
self.name = name
self.age = age
if __name__ == "__main__":
animal = Animal('动物', 20)
print(animal.__dict__)
# 1.判断一个属性是否在对象中
print(hasattr(animal, 'name'))
print(hasattr(animal, 'age'))
# 2.获取属性的值
print(getattr(animal, 'name'))
# 3.setattr设置值
setattr(animal, 'color', '黄色')
print(animal.__dict__)
# 4.删除值
delattr(animal, 'name')
print(animal.__dict__)
三、反射的主要用途
反射是可以事先定义好接口,然后判断,只有接口在完成后才会真正的执行(只要有就会执行)
例如:
class FtpClient(object): """ 定义一个ftp的客户端 """ def __init__(self, address): self.address = address def get(self): pass if __name__ == "__main__": f1 = FtpClient('192.168.1.1') if hasattr(f1, 'get'): print('调用get函数') else: print('get函数不存在')
四、类使用hasattr
、getattr
、setattr
class Foo(object):
staticField = '哈哈'
def __init__(self):
self.name = '张三'
def func(self):
return 'func'
@staticmethod
def bar():
return 'bar'
if __name__ == "__main__":
print(getattr(Foo, 'staticField'))
print(getattr(Foo, 'func'))
print(getattr(Foo, 'bar'))
print(hasattr(Foo, 'bar'))
五、使用反射导包
1、导入当前包
import sys def s1(): print('s1') def s2(): print('s2') if __name__ == "__main__": this_module = sys.modules[__name__] print(hasattr(this_module, 's1')) print(getattr(this_module, 's2'))
2、导入别的地方的包
# 正常导包的方式 # from day11.lib import test # 使用反射导包 module_t = __import__('lib.test') if __name__ == "__main__": # print(test.test()) print(module_t) print(module_t.test) print(module_t.test.test())
3、使用
importlib
导包import importlib m = importlib.import_module('lib.test') if __name__ == "__main__": print(m.test())
六、类中使用__getattr__
、__setattr__
、__delattr__
的使用
1、基本认识
class Foo(object): x = 1 def __init__(self, y): self.y = y def __getattr__(self, item): """ 在获取值的时候触发 """ print('--->getattr方法', item) def __setattr__(self, key, value): """ 会在设置值或者修改值的时候触发该方法, 但是要自己手动赋值 """ print('==',self.__dict__) self.__dict__[key] = value print('--->setattr方法', key, value) def __delattr__(self, item): print('--->delattr方法', item)
2、赋值的时候限制数据类型
class Foo(object): def __init__(self, name): self.name = name def __setattr__(self, key, value): print('---setattr', key, value) if type(value) is str: self.__dict__[key] = value else: print('赋值必须的字符串类型') def __getattr__(self, item): print(item) def __delattr__(self, item): print('--delattr', item)