一:isinstance和issubclasspython
# 对象与类之间的关系 # 判断第一个参数是不是第二个参数的实例 # 身份运算 2 == 3 # 值是否相等 2 is 3 # 内存地址是否相等 class A:pass class B(A):pass class C(B):pass c = C() print(isinstance(c,A)) # 包含继承关系的判断 print(type(b) is B) * 会报错 type只关心建立这个对象的类 print(type(b) is A) # 只关心建立这个对象的类t* 会报错 # 类与类之间的关系 issubclass() class A:pass class B(A):pass print(issubclass(A,B)) print(issubclass(B,A)) # 第一个参数是疑似子类,第二个参数是疑似父类. # 最终结果若是真的是父子类关系,则返回True
二:反射编程
# 反射的定义 : 经过字符串 来 操做python代码中的 变量 函数 甚至类和方法 # class A: # name = 'alex' # 静态 属性 # age = 83 # 静态 属性 # hasattr getattr # print(getattr(A,'name')) 无实例化,就用类名,Python类也是一个对象 # print(hasattr(A,'name')) # 在类中使用 类中获取类的静态属性 # tag = input('>>>') # if hasattr(A,tag): # print(getattr(A,tag)) # 属性的值 = getattr(类名,字符串数据类型的属性名) # 若是第二个参数是不存在的属性名,则会报错 # class Student: def __init__(self,name,age): self.name = name self.age = age def show(self): for key in self.__dict__: print(key,self.__dict__[key]) yuan = Student('苑昊',38) # yuan.show() # 'show' if hasattr(yuan,'name'): print(getattr(yuan,'name')) if hasattr(yuan,'show'): func = getattr(yuan,'show') func()
打印结果:sass
苑昊
name 苑昊
age 38网络
反射2:函数
hasassr getattr 类.静态属性 getattr(类,'静态属性') 对象.方法 getattr(对象,'方法')() 直接反射获得一个方法以后调用 对象.对象属性 应用场景 : 网络编程 从文件中读取信息反映到编程中 setattr delattr class Student: def __init__(self,name,age): self.name = name self.age = age def show(self): for key in self.__dict__: print(key,self.__dict__[key]) hei = Student('小黑',18) hei.sex = '不详' print(hei.sex) setattr(hei,'sex','不详') # 增改操做 print(hei.sex) setattr(hei,'sex','male') print(hei.sex) delattr(hei,'sex') # 删除操做 print(hei.__dict__) def wahaha(a,b): # 专属于某一个对象的静态方法 print(a,b) setattr(hei,'func',wahaha) #这样写有问题 print(hei.__dict__) hei.func(1,2) hasattr 判断某一个 变量 是否可以.调用一个名字,返回True或者False getattr 直接获取一个变量中的名字的值 setattr 为一个变量增长或者修改一个属性 delattr 删除一个变量中的属性或者方法 d = {'k':'v'} #d.keys() print(getattr(d,'keys')()) f = open() # f文件操做对象 f.read() # 文件对象.read方法
打印结果:spa
不详
不详
male
{'name': '小黑', 'age': 18}
{'name': '小黑', 'age': 18, 'func': <function wahaha at 0x00000000003B2E18>}
1 2
dict_keys(['k'])ssr
包内的文件对象
# 包 # import 包名 ---> 包内的__init__文件 # def sww(): # print('爽歪歪') # count = 0 import sys # print(sys.modules[__name__]) # 必定是aaa.py # print(sys.modules['__main__']) # 不肯定的 # print(getattr(sys.modules[__name__],'count')) # getattr(sys.modules[__name__],'sww')() # print(sys.modules[__name__]) # # print(sys.modules['my_moudle']) # # print(my_moudle) # print(getattr(sys.modules['my_moudle'],'qqxing')) # 反射类中的名字 # getattr(类名,'静态属性') # getattr(类名,'类方法')() # getattr(类名,'静态方法')() # 反射对象中的名字 # getattr(对象名,'对象属性') # getattr(对象名,'方法名')() # 反射模块中的名字 # import 模块名 # getattr(模块名,'模块中的变量') # getattr(模块名,'模块中的函数')() # getattr(模块名,'模块中的类名') # 反射当前模块中的名字 # import sys # getattr(sys.modules[__name__],'变量') # getattr(sys.modules[__name__],'函数')() # getattr(sys.modules[__name__],'类名') # sys.modules[__name__] # import sys # print(sys.modules[__name__]) # 全部导入过的模块 # {'字符串数据类型的模块名':模块的内存地址} # {'__main__':当前模块的内存地址} # 怎么反射类 ? # class Student: # def __init__(self,name,age): # self.name = name # self.age = age # def show_student(self): # for key in self.__dict__: # print(key,self.__dict__[key]) # # class Teacher: # def __init__(self, name, age): # self.name = name # self.age = age # # def show_teacher(self): # for key in self.__dict__: # print(key, self.__dict__[key]) # # class Manager: # def __init__(self, name, age): # self.name = name # self.age = age # # def show_manager(self): # for key in self.__dict__: # print(key, self.__dict__[key]) # # hei = Student('小黑',18) # import sys # main = sys.modules[__name__] # # import my_moudle # # cls = getattr(my_moudle,'Student') # # hei = cls('小黑',18) # # print(hei,hei.__dict__) # # # 'Manager' 'Teacher' 'Student' # # 获取字符串数据类型的类名 # cls_name = input('>>>') # # # 根据输入反射找到具体的类 # if hasattr(main,cls_name): # cls = getattr(main,cls_name) # # # 实例化对象 # alex = cls('alex',81) # print(type(alex)) # # 展现这个对象中的全部方法 # for i in alex.__dict__: # print(i,alex.__dict__[i]) # # # 用反射的知识 实现 # # 写一我的类,这我的类 没有任何属性 实例化这个类 而后根据你的姓名和年龄为这个对象添加属性 (基础) # # 登陆成功以后自动建立和用户身份匹配的类的对象