学了面向对象三大特性继承,多态,封装。今天我们看看面向对象的一些进阶内容,反射和一些类的内置函数。
一、isinstance和issubclass
class Foo: passclass Son(Foo): passs = Son()#判断一个对象是不是这个类的对象,传两个参数(对象,类)print(isinstance(s,Son))print(isinstance(s,Foo))#type更精准print(type(s) is Son)print(type(s) is Foo)#判断一个类是不是另一类的子类,传两个参数(子类,父类)print(issubclass(Son,Foo))print(issubclass(Son,object))print(issubclass(Foo,object))print(issubclass(int,object))
二、反射
反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。
python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)
四个可以实现反射的函数:hasattr,getattr,setattr,delattr
下列方法适用于类和对象(一切皆对象,类本身也是一个对象)
class Foo: def __init__(self): self.name = 'egon' self.age = 73 def func(self): print(123)egg = Foo()#常用:#hasattr#getattr# print(hasattr(egg,'name'))print(getattr(egg,'name'))if hasattr(egg,'func'): #返回bool Foo_func = getattr(egg,'func') #如果存在这个方法或者属性,就返回属性值或者方法的内存地址 #如果不存在,报错,因此要配合hasattr使用 Foo_func()#不常用:#setattr# setattr(egg,'sex','属性值')# print(egg.sex)# def show_name(self):# print(self.name + ' sb')# setattr(egg,'sh_name',show_name)# egg.sh_name(egg)# show_name(egg)# egg.sh_name()#delattr# delattr(egg,'name')# print(egg.name)# print(egg.name)# egg.func()# print(egg.__dict__)#反射#可以用字符串的方式去访问对象的属性、调用对象的方法反射举例1
class Foo: f = 123 #类变量 @classmethod def class_method_demo(cls): print('class_method_demo') @staticmethod def static_method_demo(): print('static_method_demo')# if hasattr(Foo,'f'):# print(getattr(Foo,'f'))print(hasattr(Foo,'class_method_demo'))method = getattr(Foo,'class_method_demo')method()print(hasattr(Foo,'static_method_demo'))method2 = getattr(Foo,'static_method_demo')method2()#类也是对象反射举例2
import my_module# print(hasattr(my_module,'test'))# # func_test = getattr(my_module,'test')# # func_test()# getattr(my_module,'test')()#import其他模块应用反射from my_module import testdef demo1(): print('demo1')import sysprint(__name__) #'__main__'print(sys.modules)#'__main__': <module '__main__' from 'D:/Python代码文件存放目录/S6/day26/6反射3.py'>module_obj =sys.modules[__name__] #sys.modules['__main__']# module_obj : <module '__main__' from 'D:/Python代码文件存放目录/S6/day26/6反射3.py'>print(module_obj)print(hasattr(module_obj,'demo1'))getattr(module_obj,'demo1')()#在本模块中应用反射反射举例3
新闻热点
疑难解答