首页 > 编程语言 >【二十四】Python中super()详解及应用场景举例(1)

【二十四】Python中super()详解及应用场景举例(1)

时间:2023-06-01 20:44:30浏览次数:75  
标签:__ Python type self 详解 super class def

【二十四】Python中super()详解及应用场景举例(1)

【1】作用

  • super也是一个类,是的。他不是一个方法也不是一个内置的关键字。
class A:
    pass

print(type(super(A)))

# <class 'super'>
  • 直接通过查看super的源码也可以看出它是一个类
class super(object):
    """
    super() -> same as super(__class__, <first argument>)
    super(type) -> unbound super object
    super(type, obj) -> bound super object; requires isinstance(obj, type)
    super(type, type2) -> bound super object; requires issubclass(type2, type)
    Typical use to call a cooperative superclass method:
    class C(B):
        def meth(self, arg):
            super().meth(arg)
    This works for class methods too:
    class C(B):
        @classmethod
        def cmeth(cls, arg):
            super().cmeth(arg)
    """
    def __getattribute__(self, *args, **kwargs): # real signature unknown
        """ Return getattr(self, name). """
        pass

    def __get__(self, *args, **kwargs): # real signature unknown
        """ Return an attribute of instance, which is of type owner. """
        pass

    def __init__(self, type1=None, type2=None): # known special case of super.__init__
        """
        super() -> same as super(__class__, <first argument>)
        super(type) -> unbound super object
        super(type, obj) -> bound super object; requires isinstance(obj, type)
        super(type, type2) -> bound super object; requires issubclass(type2, type)
        Typical use to call a cooperative superclass method:
        class C(B):
            def meth(self, arg):
                super().meth(arg)
        This works for class methods too:
        class C(B):
            @classmethod
            def cmeth(cls, arg):
                super().cmeth(arg)
        
        # (copied from class doc)
        """
        pass

    @staticmethod # known case of __new__
    def __new__(*args, **kwargs): # real signature unknown
        """ Create and return a new object.  See help(type) for accurate signature. """
        pass

    def __repr__(self, *args, **kwargs): # real signature unknown
        """ Return repr(self). """
        pass

    __self_class__ = property(lambda self: type(object))
    """the type of the instance invoking super(); may be None

    :type: type
    """

    __self__ = property(lambda self: type(object))
    """the instance invoking super(); may be None

    :type: type
    """

    __thisclass__ = property(lambda self: type(object))
    """the class invoking super()

    :type: type
    """

【2】纠正(super就是用来调用父类方法的,这是一个错误的观点!

class A:
    def __init__(self):
        print("A")


class B(A):
    def __init__(self):
        print("B")
        super().__init__()


class C(A):
    def __init__(self):
        print("C")
        super().__init__()


class D(B, C):
    def __init__(self):
        print("D")
        super().__init__()


D()

# D
# B
# C
# A
  • 如果按照“super就是用来调用父类的方法的”这样的理解来看,那上述代码的执行的过程应该为:

    • print("D")
    • 【调用super会先后执行B和C】
    • 先执行B:print("B")
    • 【调用super执行A】
    • print("A")
    • 【调用super会先后执行B和C】
    • 后执行C:print("C")
    • 【调用super执行A】
    • print("A")
  • 执行结果理论应该为:D B A C A

  • 但实际情况却是:D B C A

  • 所以说“super就是用来调用父类的方法的”这个说法是错误的!

  • 实际上super的调用是遵循Python的【MRO(方法解析顺序)】来执行的,在Python3中,MRO是基于C3算法来实现的。

【3】使用场景

  • 1.假如我们继承的多个父类有同名的方法
    • 可以使用super来指定使用哪个父类的方法
class A:
    def test(self):
        print('A')

class B:
    def test(self):
        print('B')

class C(A, B):
    def __init__(self):
        super().test()  # 调用A类中的test方法
        super(C, self).test()  # 调用A类中的test方法
        super(A, self).test()  # 调用B类中的test方法    
        
C()

# A
# A
# B
  • 2.当我们在子类中使用父类的一个方法并且想对其做一定扩展又不想完全重写,那么使用super()就可以实现方法的增量修改:
    • 举一个例子,如果我们想把list中的append的方法改为中文添加应该怎么做呢?
    • 并且python中list调用append方法是没有返回值的,我们想在添加元素操作成功后加一个返回值返回成功又该如何操作呢?
  • 首先看通过调用原来的list的执行结果
a=list()
res=a.append(1)
print(res)

# None
  • 可以看到调用append方法后返回的值为None
  • 现在我们通过super进行重写
    • 让其具有返回值并可以直接通过中文来调用append:
class 列表(list):
    def 添加(self, *args, **kwargs):
        super().append(*args, **kwargs)
        return "添加成功"

x = 列表()
res = x.添加(1)
print(res)
print(x)

# 添加成功
# [1]

【4】总结

  • super实际上还是很常用的
    • 比如在restfremework中
      • 需要重写其响应结果的Response信息的时候
      • 除了通过django的中间件实现
      • 也可以使用super重写其dispatch来实现。

标签:__,Python,type,self,详解,super,class,def
From: https://www.cnblogs.com/dream-ze/p/17450154.html

相关文章

  • 【二十三】Python 中 property() 函数及 @property 装饰器的使用(1)
    【二十三】Python中property()函数及@property装饰器的使用(1)【1】property应用场景在获取、设置和删除对象属性的时候,需要额外做一些工作。比如在游戏编程中,设置敌人死亡之后需要播放死亡动画。需要限制对象属性的设置和获取。比如用户年龄为只读,或者在设置用户......
  • Python循环语句
    #循环语句#使用while循环打印出0-100的所有数字#循环的初始化条件num=1#当num<100时,会一直执行循环体whilenum<101:  print("num=",num)  #迭代语句  num+=1print("循环结束")print("---------------------------")#使用while遍历字符串str="TheageofM......
  • mysql5.7配置文件详解
    8核心32G独立mysql服务器的配置文件如下:[client]port=3306socket=/data/mysql/mysql.sock[mysql]prompt="mysql[\d]>"no-auto-rehash[mysqldump]quick[mysqld]user=mysqlport=3306basedir=/usr/local/mysqldatadir=/data/mysqlsocket=/......
  • 【Python】pandas dataframe 插入一行数据
    pandas插入一行数据#需要借助numpy操作importnumpyasnpimportpandasaspdvalue={"a":[1,2,3],"b":[1,2,3],"c":[1,2,3]}df=pd.DataFrame(value)df1=pd.DataFrame(np.insert(df.values,0,values=[0,0,0],axis=0))df1.columns=df......
  • Python multipart/form-data上传图片,包含file和其他参数的复杂情况
    我们先来看看multipart/form-data上传原理,如下图:   如上图,我们的请求头必须包含一个特殊的请求头信息:Content-Type,类型为:multipart/form-data,而且还要有一个内容分割符(boundary)用于分割请求体中的多个post的内容。因为接收方解析和还原文件必须要根据这个boundary......
  • Python multipart/form-data上传图片只有file一个参数的情况
    格式:multipart/form-data的基础方法是post,也就是说是由post方法来组合实现的,与post方法的不同之处:请求头,请求体。multipart/form-data的请求头必须包含一个特殊的头信息:Content-Type,且其值也必须规定为multipart/form-data,同时还需要规定一个内容分割符用于分割请求体中的多个......
  • 补充 : 函数之装饰器详解
    函数之装饰器详解装饰器的用途就是为了在不改变原来代码的前提下,将新的功能和函数加入进去【一】简单版本的装饰器#-*-coding:Utf-8-*-#@File:装饰器详解.py#author:Chimengmeng#blog_url:https://www.cnblogs.com/dream-ze/#Time:2023/5/20importtime......
  • day16 Python下的三元运算符
    Python下的三元运算符【一】引言三元表达式(三目运算符)能够简洁我们的代码三元表达式其实是将if...else...判断语句的简化表达,代替很多ifelse和if-else一样,只有一个表达式会被执行。因此,三元表达式中的if和else可以包含大量的计算,但只有True的分支会被执行在Java、C......
  • python selenium 下拉框处理
    在自动化测试中,处理下拉框(Dropdown)有以下几种方式:1.使用Select类:通过select的相关方法选择option选项select.select_by_index(index)参数index表示的option索引select.select_by_value(value)参数value表示的是option元属中value的属性值select.select_by_visible_te......
  • Python笔记:正则表达式方法
    正则表达式并不是Python的一部分。正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大。得益于这一点,在提供了正则表达式的语言里,正则表达式的语法都是一样的,区别只在于不同的编程语言实现支持的语法数量不......