标签:
1.isinstance判断一个对象是否是类(可以是类本身,也可以是父类)的实例
class Foo: pass class Bar(Foo): pass obj = Bar() ret_b = isinstance(obj,Bar) ret_f = isinstance(obj,Foo) print (ret_b) print (ret_f)
结果:
True
True
2.issubclass判断一个类是否是另外一个类的子类
class Foo: pass class Bar(Foo): pass ret = issubclass(Bar,Foo) print (ret)
结果:
True
3.super
class C1: def f1(self): print ("c1.f1") class C2(C1): def f1(self): super(C2,self).f1() print ("c2.f1") obj = C2() obj.f1()
结果:
c1.f1
c2.f1
在生成一个对象的时候,如果类中定义的方法名与父类的方法名相同,我们默认执行对象的方法,但是我们如果需要也同时执行父类的方法的话,就需要使用到super。
super的使用示例:
backend是一个需要引用的功能模块,不能更改,但是现在需要定制化其功能,它下面有一个功能模块commons,里面有一个方法f1,我们需要在不改变其源码的前提下完善自己的功能。
settings是配置文件
Path = "backend.commons"
ClassName = "Foo"
index是主程序,利用反射的getattr方法可以获取到类对象,然后加()实例化类,然后调用对象的f1方法
from settings import ClassName from settings import Path def execute(): # print (ClassName) model = __import__(Path,fromlist=True) #字符串拼接 cls = getattr(model,ClassName) obj = cls() obj.f1() if __name__ == ‘__main__‘: execute()
为了能够使用原来的功能,我们需要继承原有的类,定义一个自己的类MyFoo,位于模块lib
from backend.commons import Foo class MyFoo(Foo): def f1(self): print ("before") super(MyFoo,self).f1() print ("after")
此时,我们再修改配置文件settings
Path = "lib" ClassName = "MyFoo"
运行index得到结果:
before
Foo.f1
after
利用super,__setitem__,__str__实现有序字典
__author__ = ‘Alex‘ class MyDict(dict): def __init__(self): self.li = [] super(MyDict, self).__init__() def __setitem__(self, key, value): self.li.append(key) super(MyDict, self).__setitem__(key,value) def __str__(self): val_list = [] for key1 in self.li: val1 = self.get(key1) val_list.append("‘%s‘:%s" %(key1,val1)) temp_str = ‘{‘ + ‘,‘.join(val_list) + ‘}‘ return temp_str obj = MyDict() obj[‘k1‘] = 123 obj[‘k2‘] = 456 print (obj)
Python 面向对象5-isinstance,issubclass,super,有序字典
标签:
原文地址:http://www.cnblogs.com/python-study/p/5738952.html