zoukankan      html  css  js  c++  java
  • Python3.x基础学习-类--super


    super()方法

    子类和父类有相同的方法,如果子类想调用父类的方法,可以使用super()方法
    在python3中,子类执行父类的方法也可以直接用super方法 ---》super()
    super默认省略了两个参数,第一个参数是当前类名,第二个参数是self
    两个参数可以省略不传递例如 super(Student,self) super()还可以从类的外部使用,需要传递类名(本类的名称)和对象名
    例如 super(Student,student)格式:父类类名.方法名称(self)或者super().方法名称()或者super(本类类名,对象名)

    class Dog:
        def bite(self):
            print("汪汪叫")
    
    class Hsq(Dog):
        def bite(self):
            # Dog.bite(self)
            # super().bite()
            super(Hsq,self).bite()
            print("狂吼")
    
    
    hsq = Hsq()
    hsq.bite()
    Dog.bite(Dog)
    
    # 汪汪叫
    # 狂吼
    # 汪汪叫
    __init__()方法


    -子类继承父类,如果子类不复写父类的__init__()方法,常见子类对象的时候会自动调用父类__init__()方法。
    -子类继承父类,如果子类复写了父类的__init__()方法,创建的子类对象的时候不会再调用父类的__init__()方法。
    -注意:python要求复写父类的__init__()方法时,需要调用父类的__init__()因为存在隐患
    例如父类的初始化方法有参数,子类初始化无参数,子类再调用父类的参数的时候就会报错

    1.子类里没有__init__()方法,会调用父类的,有会调用自己的
    2.调用父类的初始化方法,先执行父类的,再执行子类的
    3.调用父类的初始化方法,如果父类方法中有参数,必须传递相应的参数,否则会报错

    class Person:
        def __init__(self):
            print("---person--")
    
    class Student(Person):
        def __init__(self):
            print("--student--")
    
    stu = Student()
    
    
    class Person:
        def __init__(self,name,age):
            self.name = name
            self.age = age
            print("---person--")
    
    class Student(Person):
        pass
        def __init__(self,name,age,weight):
            super(Student,self).__init__(name,age)
            self.weight = weight
            print("--student--")
    
    stu = Student('johnson',22,111)
    
    # --student--
    # ---person--
    # --student--
    派生属性


    属性的覆盖(派生属性):子类也可以添加自己新的属性或者在自己这里重新定义 这些属性(不会影响到父类)
    需要注意的是,一旦重新定义了自己的属性且与父类重名,那么调用新增的属性时,就以自己的为准了(属性的覆盖)

    class Person:
        num =10
        def __init__(self,name,age,weight):
            self.name = name
            self.age = age
            self.weight = weight
    
    class Student(Person):
        num = 20
        def __init__(self,name,age,weight):
            super(Student,self).__init__(name,age,weight)
            print(self.weight)
    
        def introduce(self):
            print(self.num)
            print(Person.num)
            print(super(Student,self).num)
    
        def __str__(self):
            return "我叫{},今年{}岁,体重{}公斤".format(self.name,self.age,self.weight)
    
    
    stu = Student('johnson',22,111)
    stu.introduce()
    print(stu)
    
    # 111
    # 20
    # 10
    # 10
    # 我叫johnson,今年22岁,体重111公斤
    私有属性
    私有方法在继承中的表现
    父类中的私有方法和私有属性都是不能被子类继承下来的。
    练习:测试父类中的私有属性和私有方法是否能被继承下来
    class Father:
        def __init__(self,__name,age):
            self.__name = __name
            self.age = age
    
        def __call_name(self):
            print("我今年{}".format(self.age))
    
    class Son(Father):
        def __init__(self,__name,age):
            super(Son,self).__init__(__name,age)
    
        def call_name(self):
            super(Son, self).__call_name()
    
    son = Son('john',25)
    son.call_name()
    
    #AttributeError: 'super' object has no attribute '_Son__call_name'
    class A:
        __num = 10
        def __test1(self):
            print("test1")
        def test2(self):
            print("test2")
    class B(A):
        def test3(self):
            print('test--B')
            # print(A.__num)
            self.test2()
            # self.__test1()
            # super(B,self).__test1()
    b=  B()
    b.test3()
    
    # test--B
    # test2


  • 相关阅读:
    [置顶] 移动应用不得不看的三张图
    重新签名apk文件(手工用命令行)
    o(n)解决问题:调整数组顺序是奇数位于偶数的前面
    安装DBMS_SHARED_POOL包
    sql server 实现sleep延时
    【Unity 3D】使用 2DToolkit 插件 制作2D精灵动画
    消息对话框(MessageBox)用法介绍
    java监控之ManagementFactory分析
    Java内存模型深度解析:总结--转
    Java内存模型深度解析:final--转
  • 原文地址:https://www.cnblogs.com/johnsonbug/p/12707713.html
Copyright © 2011-2022 走看看