前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python面向对象6:​isinstance、super、有序字典

Python面向对象6:​isinstance、super、有序字典

作者头像
企鹅号小编
发布2018-01-29 13:09:23
5970
发布2018-01-29 13:09:23
举报
文章被收录于专栏:编程编程

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

本文来自企鹅号 - 乐想屋媒体

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文来自企鹅号 - 乐想屋媒体

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档