1、isinstance(对象名,类),查看对象是不是类的实例。
案例1:isinstance(对象名,类)
classFoo:
print('hh')
obj=Foo()
ret=isinstance(obj,Foo)
print('查看obj是不是类Foo的实例:',ret)
执行结果:
2、查看子类是否为父类的子类,issubclass(类1,类2),看类1是不是类2的子类
案例2:issubclass(类1,类2)
classBar:
pass
classFoo(Bar):
pass
ret=issubclass(Foo,Bar)
print('Foo是不是Bar的子类:',ret)
ret2=issubclass(Bar,Foo)
print('Foo是不是Bar的子类:',ret2)
执行结果:
3、super执行父类的方法
案例1:用super主动执行父类相同的方法,同时也会执行子类的方法。
classc1:
deff1(self):
print('c1.f1')
classc2(c1):
deff1(self):
super(c2,self).f1()#主动执行父类的f1
print('c2.f1')
obj=c2()#创建对象
obj.f1()#因为有super,在执行自己的方法后,还可以执行父类的方法
执行结果:
案例2-1:假设有一个项目,目录如下,其中,commons里面有些别人写的源码,需要在index中写代码调用commons里面的类
其中:
1)commons文件的内容
#commons文件
classFoo:
deff1(self):
print('Foo.f1')
2)settings文件内容,仅在配置文件中配置类名
#settings 放所有的配置文件
classname="Foo"
3)index文件,写自己的代码,调用别人代码中commons内容
fromsettingsimportclassname
fromotherscodeimportcommons
defrun():
print(classname)
cls=getattr(commons,classname)#用反射思想获取方法/类
obj=cls()#创建对象
obj.f1()#执行普通方法
if__name__ =='__main__':
run()
执行结果:
案例2-2,如果commons也需要再配置文件配置,则需要修改settings文件如下:
1、settings文件内容,将commons也放入配置文件
#settings 放所有的配置文件
path="otherscode.commons"
classname="Foo"
2、index文件调用
#index文件
fromsettingsimportclassname
fromsettingsimportpath
fromotherscodeimportcommons
defrun():
print(classname)
model=__import__(path,fromlist=True)#用import导入模块
cls=getattr(model,classname)#用反射思想获取方法/类
obj=cls()#创建对象
obj.f1()#执行对象中的方法
if__name__ =='__main__':
run()
执行结果:
案例2-3在不修改源码commons的基础上,在之前和之后做一些操作;
假设commons和index都不让修改
1)修改settings
#settings 放所有的配置文件
path='lib'
classname='myfoo'
2)lib文件中写入自己的类,类似于装饰器,但不修改源码,只主动执行源码的方法
#lib文件
fromotherscode.commonsimportFoo
classmyfoo(Foo):
deff1(self):
print('before')
super(myfoo,self).f1()
print('after')
3)index文件不做任何修改,执行结果
3、设置有序字典
classmydict(dict):#继承字典的类,字典是无序的
def__init__(self):
self.li=[]
super(mydict,self).__init__()#执行父类dict的init方法
def__setitem__(self, key, value):
self.li.append(key)
super(mydict,self).__setitem__(key,value)#执行父类dict的setitem方法,设置字典或新增字典值
def__str__(self):#mydict自己的str方法
temp_list=[]#设置一个空字典,用于存放字典为列表
forkeyinself.li:
value=self.get(key)
temp_list.append("%s:%s"%(key,value))
temp_str="字典拼接后{"+",".join(temp_list)+"}"
returntemp_str
obj=mydict()
obj['k1']=123#obj['k1']会执行getitem,有等号的时候执行setitem
obj['k2']=456
print(obj)#会执行mydict类中的str方法,如果mydict无str方法,则执行dic的str方法
执行结果:字典显示顺序永远不会变
案例链接:https://pan.baidu.com/s/1jHNYlmQ 密码:xd78
领取专属 10元无门槛券
私享最新 技术干货