Python 基础第二十三天(反射)
今日主要内容
1.面向对象高级特性---反射
2.内置函数和内置方法补充
1.什么是反射:
通过内置函数getattr(),hasattr(),setattr(),delattr()实现,在类外通过对字符串的操作,能够将类内同名的静态变量,方法,如对象属性是无法取到值的.
也可以理解为:
***正常情况下如果可以拿到这个变量 那么如有有这个变量的字符串形式 就是用反射可以获取到这个值
使用字符串数据类型的变量名 访问一个命名空间中的名字
找一个属性 ,直接就可以找到这个属性的值
找一个方法 ,找到的是这个方法的内存地址
例:
class A: role = 'Person' def func(self): a = 'b' print("*" * self) print(getattr(A,'role')) #静态变量的反射 print(getattr(A,'func')) #类中方法取到的是内存地址 getattr(A,'func')(3) #类中方法的反射
**类使用类命名空间中的名字
例:下面例中使用对象名进行获取
class A: role = 'Person' def __init__(self): self.money = 500 def func(self): print('*'*10) a = A() #实例化a 为对象名称 print(a.func) getattr(a,'func')() print(getattr(a,'money'))
***对象使用对象能用的方法和属性
内置函数的介绍:
hasattr() 判断一个命名空间中有没有这个名字
getattr() 从命名空间中获取这个名字对应的值
模块含义:模块就是类所在python的文件名
例:
def login(): print('执行login功能') def register(): print('执行register功能') import sys print(sys.modules['__main__']) #<module '__main__' from 'F:/Python-script-2/s11-day23/a.py'> func = input('>>>') if hasattr(sys.modules['__main__'],func)#检查输入的信息,是否a.py有 getattr(sys.modules['__main__'],func)() # 有就执行该函数
类使用类命名空间中的名字
getattr(类名,'名字')
对象使用对象能用的方法和属性
getattr(对象名,'名字')
模块使用模块中的名字
导入模块
getattr(模块名,'名字')
import os getattr(os,'rename')('user','user_info')
getattr一定要和hasattr配合使用
setattr # 修改和新建
delattr # 删除一个属性
setattr
例:
class A: def __init__(self,name): self.name = name def wahaha(self): print('wahahahahaha') a = A('alex') a.name a.wahaha() getattr(a,'name') print(a.__dict__) setattr(a,'age',18) #增加了一个属性 print(a.__dict__) 结论: wahahahahaha {'name': 'alex'} {'name': 'alex', 'age': 18}
delattr
例:
class A: def __init__(self,name): self.name = name def wahaha(self): print('wahahahahaha') a = A('alex') a.name a.wahaha() getattr(a,'name') print(a.__dict__) setattr(a,'age',18) print(a.__dict__) delattr(a,'age') print(a.__dict__) 结论: wahahahahaha {'name': 'alex'} {'name': 'alex', 'age': 18} {'name': 'alex'}
2.内置函数,方法补充
isinstance :判断一个对象和一个类有没有血缘关系
issubclass:issubclass(子类名,父类名) 如果返回True,说明有继承关系.判断子类和父类是否有继承关系
isinstance与type方法类似,都能判断数据类型,但是isinstance还能还能检测是否有继承关系
例:
class B:pass class A(B):pass a = A() print(isinstance(a,A)) print(isinstance(a,B)) # 能够检测到继承关系 print(type(a) is A) print(type(a) is B) # type只单纯的判断类 # 判断一个对象和一个类有没有血缘关系 isinstance(a,A)
__hash__ :object类自带的方法.只有类实现了__hash__,hash()才能用
__len__:放在类中的计算传值结果的长度,数量 同len(),类中含有__len__方法,才能使用len()函数