zoukankan      html  css  js  c++  java
  • super().__init__()用法

     

    super().__init__()的用法

    
    
    """
    推荐使用的派生方法:super().__init__()
    
    --super()的属性查找顺序是从当前位置开始找,根据mro列表,当前没有就往上找。
    
    super() 函数是用于调用父类的一个方法。
    
    super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,
    
    但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。
    
    MRO 就是类的方法解析顺序表, 其实也就是继承父类方法时的顺序表。
    
    
    --super(),会得到一个特殊的对象,该对象就是专门用来
    访问父类中的属性的(严格按照继承的关系)
    
    --super().__init__(),此处__init__(),
    括号中不需要传值self。
    
    --在Python2中,super()的完整用法是super(自己类名,self),
    在Python2中需要写完整,而Python3中可以简写为super()。
    
    
    --用法解析:
    在子类的__init__方法中使用 super().__init__() , 就相当于把父类的 __init__构造方法拿过来用, 并且可以对父类的__init__方法进行补充(比如添加成员属性/方法) ,
    也就相当于把父类的__init__方法继承过来了, 之后用子类实例化一个对象后, 这个对象可以点出父类对象的成员属性/方法, 当然也可以点出自己类对象的成员属性/方法

    原本的话子类中的__init__方法会覆盖掉父类的__init__方法, 导致无法通过实例化子类的类对象去给父类的类对象添加成员属性/方法,也无法调用父类类对象的属性/方法
    """普通情况"""
    class OldboyPeople:
        school='oldboy'
        def __init__(self,name,age,sex):
            self.name=name
            self.age=age
            self.sex=sex
    
    class OldboyStudent(OldboyPeople):
        def __init__(self,name,age,sex,stu_id): 
         self.stu_id=stu_id
        def choose_course(self):
         pass
    obj2 = MyClass2("chen",12,1,"123") # 虽然接收了这些参数,但是并没有给对象添加属性
    # print obj2.name # 会报错,子类的类对象没有name属性
    print(obj2.__dict__) # {"stu_id":"123"}
    # 如果把子类的__init__方法注释掉,实例化传参obj2 = MyClass2("chen",12,1),就会调用父类的__init__方法,也就是说通常情况下,父类的__init__方法和子类的__init__方法只能用一个
    
    
    """使用super().__init__()后"""
    class OldboyPeople:
        school='oldboy'
        def __init__(self,name,age,sex):
            self.name=name
            self.age=age
            self.sex=sex
    
    class OldboyStudent(OldboyPeople):
        def __init__(self,name,age,sex,stu_id):
            super().__init__(name,age,sex)
            self.stu_id=stu_id
    
        def choose_course(self):
            print('%s is choosing course'%self.name)
            # return 'true'
            # 函数自带返回值none,如果把return 'true'这一行注释的话,
            # 那么打印的print(stu1.choose_course())这个结果就会是:tank is choosing course
            # 并且还会打印出有None。
    
    stu1=OldboyStudent('tank',19,'male',1)
    print(stu1.__dict__)
    print(stu1.choose_course())
    
    上述程序输出的打印结果如下所示:
    {'name': 'tank', 'age': 19, 'sex': 'male', 'stu_id': 1}
    tank is choosing course
    None
    class MyClass1(object):
        age = 18
    
        def __init__(self):
            self.name = "chen"
    
    
    class MyClass2(MyClass1):
        def __init__(self):
            super(MyClass2, self).__init__()
            # self["key1"] = 666 # 会报错'MyClass2' object does not support item assignment
            self.sex = ""
    
    class MyClass3(dict):
        def __init__(self,**kwargs):
            super(dict, self).__init__() # 注意第一个参数是dict,而不是自己的类
            self["key1"] = 666
            self.sex = ""
    
    # obj2 = MyClass2()
    # print(obj2.name, obj2.age, obj2.sex) # chen 18 男
    obj3 = MyClass3()
    #######取值
    print (obj3.sex) #
    print( obj3["key1"]) # 666
    #######添加
    obj3['love']='sleep'  #添加
    print(obj3)
    ######修改
    obj3['love']='swiming'
    print(obj3)
    ######删除
    obj3.pop('love')
    print(obj3)

    Myclass3 继承了dict类. 并且在__init__方法中使用 super(dict, self).__init__() ,使得Myclass3实例化的类对象具有dict字典的特征

    即可以对Myclass3类对象进行字典操作, 比如添加键值对, 通过键取值等等

  • 相关阅读:
    css3新特性总结
    ES6常用特性总览
    前端第一次面试
    将一个行数在主线程执行的4中方法
    判断邮箱格式和图片压缩
    上传图片的实现
    导航右侧添加按钮、隐藏导航条和状态栏
    从相册选取图片展示并实现自定义事件
    cell添加选中时的背景图片、显示图片和图片自适应框的大小
    设置键盘无色和状态栏风火轮、屏幕截图
  • 原文地址:https://www.cnblogs.com/Hale-wang/p/13552645.html
Copyright © 2011-2022 走看看