Python 面向对象5-isinstance,issubclass,super,有序字典

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)
原文地址:https://www.cnblogs.com/python-study/p/5738952.html