您的位置:首页 > 编程语言 > Python开发

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

2017-12-24 00:00 579 查看
1、isinstance(对象名,类),查看对象是不是类的实例。
案例1:isinstance(对象名,类)class Foo:
print('hh')

obj=Foo()
ret=isinstance(obj,Foo)
print('查看obj是不是类Foo的实例:',ret)
执行结果:



2、查看子类是否为父类的子类,issubclass(类1,类2),看类1是不是类2的子类
案例2:issubclass(类1,类2)
class Bar:
pass
class Foo(Bar):
pass
ret=issubclass(Foo,Bar)
print('Foo是不是Bar的子类:',ret)
ret2=issubclass(Bar,Foo)
print('Foo是不是Bar的子类:',ret2)执行结果:



3、super执行父类的方法
案例1:用super主动执行父类相同的方法,同时也会执行子类的方法。class c1:
def f1(self):
print('c1.f1')
class c2(c1):
def f1(self):
super(c2,self).f1()#主动执行父类的f1
     print('c2.f1')

obj=c2()#创建对象
obj.f1()#因为有super,在执行自己的方法后,还可以执行父类的方法执行结果:



案例2-1:假设有一个项目,目录如下,其中,commons里面有些别人写的源码,需要在index中写代码调用commons里面的类



其中:
1)commons文件的内容#commons文件
class Foo:
def f1(self):
print('Foo.f1')
2)settings文件内容,仅在配置文件中配置类名#settings 放所有的配置文件

classname="Foo"3)index文件,写自己的代码,调用别人代码中commons内容from settings import classname
from otherscode import commons

def run():
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文件
from settings import classname
from settings import path
from o
b8a6
therscode import commons

def run():
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文件
from otherscode.commons import Foo
class myfoo(Foo):
def f1(self):
print('before')
super(myfoo,self).f1()
print('after')3)index文件不做任何修改,执行结果



3、设置有序字典
class mydict(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=[]#设置一个空字典,用于存放字典为列表
       for key in self.li:
value=self.get(key)
temp_list.append("%s:%s"%(key,value))
temp_str="字典拼接后{"+",".join(temp_list)+"}"
       return temp_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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: