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

 



 

posted @ 2020-04-15 20:15  Johnsonbug  阅读(230)  评论(0编辑  收藏  举报