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

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏上善若水

040android初级篇之标准java版的HelloWorld编译及运行

运行的时候,如果 .class文件不在当前目录则需要使用-classpath 指定所在目录。

853
来自专栏Python小屋

Python面向对象程序设计中属性的作用与用法

公开的数据成员可以在外部随意访问和修改,很难保证用户进行修改时提供新数据的合法性,数据很容易被破坏,并且也不符合类的封装性要求。解决这一问题的常用方法是定义私有...

2464
来自专栏Python小屋

详解Python序列解包(3)

本文主要介绍调用函数传递参数时序列解包的用法。在调用函数传递参数时,可以在实参序列前加一个星号*进行序列解包,或在实参字典前加两个星号**进行解包,本文介绍第一...

2874
来自专栏L宝宝聊IT

Shell脚本应用(for、while循环语句和case分支语句)

1404
来自专栏Deep learning进阶路

C++随记(一)---字符串数组的输入问题

首先来看一段程序: #include<iostream> using namespace std; int main(){ char name[10],s...

1970
来自专栏阿凯的Excel

排序功能(Pandas读书笔记8)

上期分享了如何读取文件内容,读取文件后我们需要对数据进行清理整理,其中一项常做的就是对原始数据进行排序。今天和大家分享如何使用pandas进行排序。 先导入上一...

3016
来自专栏zingpLiu

浅谈JavaScript词法分析步骤

JavaScript代码运行前有一个类似编译的过程即词法分析,词法分析主要有三个步骤:

1045
来自专栏Python小屋

Python正则表达式案例一则:单词非两端字符改为小写

问题描述:给定一段英文,要求把其中所有单词除两端字符之外的其他字母都改为小写。 技术要点: 1)re模块的sub()函数用法; 2)match对象的group(...

2876
来自专栏xcywt

《Linux命令行与shell脚本编程大全》第十七章 创建函数

可以将shell脚本代码放进函数中封装起来,这样就能在脚本中的任何地方多次使用它了。 17.1 基本的脚本函数 函数:是一个脚本代码块,可以为其命名并在代码中任...

18910
来自专栏开源优测

移动测试Appium之API手册

移动测试Appium之API手册 前言 本文对Appium Python Client中webdriver.py代码进行分析说明。 笔者使用python3.6版...

3909

扫码关注云+社区