• 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)
  • 相关阅读:
    MJRefreshFooterView
    UIActionSheet
    UIAlertView带textField
    SIAlertView
    旋转 锚点
    centos7.2 Apache+PHP7.2+Mysql5.6环境搭建
    ubuntu16.04 mysql 开启远程连接
    Ubuntu16.04重新安装MySQL数据库
    Ubuntu16.04彻底卸载MySQL
    laravel框架基础(2)---laravel项目加载机制
  • 原文地址:https://www.cnblogs.com/python-study/p/5738952.html
Copyright © 2020-2023  润新知