Day23
1、内置函数补充
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只单纯的判断类
issubclass(子类名,父类名) 如果返回True 说明有继承关系
class B:pass class C(B):pass class D(C):pass print(issubclass(C,D)) print(issubclass(D,C)) print(issubclass(B,C)) print(issubclass(C,B)) print(issubclass(D,B))
2、反射
反射
正常情况下如果可以拿到这个变量 那么如有有这个变量的字符串形式 就是用反射可以获取到这个值
使用字符串数据类型的变量名 访问一个命名空间中的名字
找一个属性 ,直接就可以找到这个属性的值
找一个方法 ,找到的是这个方法的内存地址
hasattr() 判断一个命名空间中有没有这个名字
getattr() 从命名空间中获取这个名字对应的值
反射 4个内置函数
getattr ******
hasattr ******
setattr # 修改和新建 **
delattr # 删除一个属性 *
role = 123 print(eval('role')) class A: role = 'Person' def func(self): print('*'*self) # ret = input('>>>') # print(A.__dict__[ret]) # getattr print(getattr(A,'role')) # 从A的命名空间里找一个属性 ,直接就可以找到这个属性的值 f = getattr(A,'func');f(1) # 从A的命名空间里找一个方法 ,找到的是这个方法的内存地址 getattr(A,'func')(1) A.func(1)
# getattr从A的命名空间里找一个属性 ,属性不存在会报错 class A: role = 'Person' def func(self): print('*'*self) print(hasattr(A,'r')) print(hasattr(A,'role')) print(hasattr(A,'func')) ret = input('>>>') if hasattr(A,ret): print(getattr(A,ret)) if hasattr(A,ret): func = getattr(A,ret) func(1)
类使用类命名空间中的名字
getattr(类名,'名字')
对象使用对象能用的方法和属性
getattr(对象名,'名字')
模块使用模块中的名字
导入模块
getattr(模块名,'名字')
import os ; getattr(os,'rename')('user','user_info')
从自己所在的模块中使用自己名字
import sys
getattr(sys.modules['__main__'],名字)
什么.什么
import time # 一个py文件就是一个模块
time.time()
print(time.time())
print(getattr(time,'time')())
import os
os.rename('userinfo','user')
getattr(os,'rename')('user','user_info')
def login(): print('执行login功能') def register(): print('执行register功能') import sys # 和python解释器相关的内容都在sys里 print(sys.modules['__main__']) func = input('>>>') if hasattr(sys.modules['__main__'],func): getattr(sys.modules['__main__'],func)()
#增删改 对象属性 class A: def __init__(self,name): self.name = name def wahaha(self): print('wahahahahaha') a = A('alex') a.name a.wahaha() getattr(a,'name') # a 'age' = 18 # a.age = 18 print(a.__dict__) setattr(a,'age',18) # 给a对象新增一个属性 print(a.__dict__) setattr(a,'name','egon') print(a.__dict__) # del a.age delattr(a,'age') print(a.__dict__)
#增删改 方法 class A: def __init__(self,name): self.name = name def wahaha(self): print('wahahahahaha') def qqxing(self): print('qqqqqxing') a = A('alex') # setattr(A,'qqxing',qqxing) setattr(a,'qqxing',qqxing) # print(a.__dict__) a.qqxing(a)
3、内置方法
class A: def __init__(self,name,age,sex,cls): self.name = name self.age = age self.sex = sex self.cls = cls def __len__(self): return len(self.__dict__) # 有一个内置函数 和内置方法len()是唯一对应的关系 a1 = A('alex',81,'不详',2) a1.hobby = '烫头' a2 = A('egon',20,'不详',3) a3 = A('yuan',21,'不详',4) print(len(a1)) print(len(a2)) print(len(a3)) l = list([1,2,3,4,5]) print(l) print(len(l))
内置的东西
都和内置的方法有着千丝万缕的联系
字典的存储
hash
class A: def __init__(self,name,age,sex,cls): self.name = name self.age = age self.sex = sex self.cls = cls def __hash__(self): return 0 a1 = A('alex',81,'不详',2) print(hash(a1))