天天看点

super() | Python从入门到精通:高阶篇之三十一

方法的重写override | Python从入门到精通:高阶篇之三十

super()

我们仍然以Animal和Dog为例。

class Animal:
    def run(self):
        print('动物会跑~~~')

    def sleep(self):
        print('动物睡觉~~~')


class Dog(Animal):
    def bark(self):
        print('汪汪汪~~~') 

    def run(self):
        print('狗跑~~~~')               

现在我们在Animal中添加属性。

def __init__(self,name):
        self._name = name

    @property
    def name(self):
        return self._name

    @name.setter    
    def name(self,name):
        self._name = name           

此时在Dog中创建对象

d = Dog()            

执行结果:

父类中的所有方法都会被子类继承,包括特殊方法,也可以重写特殊方法。此时先需要给Dog类添加属性。

修改:

d = Dog('旺财') 
# d.name = '小黑'

print(d.name)             

重写特殊方法,在Dog类中定义一个age属性。

class Dog(Animal):

    def __init__(self,name,age):
        self._name = name
        self._age = age

    def bark(self):
        print('汪汪汪~~~') 

    def run(self):
        print('狗跑~~~~')   

    @property
    def age(self):
        return self._age

    @age.setter    
    def age(self,age):
        self._age = age      

d = Dog('旺财',18) 
d.name = '小黑'

print(d.name)       
print(d.age)            
super() | Python从入门到精通:高阶篇之三十一

name属性已经在父类中定义,此时希望可以直接调用父类的__init__来初始化父类中定义的属性。

def __init__(self,name,age):
        Animal__init__(self,name)
        self._age = age

d = Dog('旺财',18) 
print(d.name)       
print(d.age)            
super() | Python从入门到精通:高阶篇之三十一

但是这个时候方法被写死,只能调用父类(Animal)中的属性。如果Dog类的父类更换,则需要修改的程序则会繁琐。不建议使用,我们需要一个动态获取父类的方法。

super() 可以用来获取当前类的父类,并且通过super()返回对象调用父类方法时,不需要传递self。

super().__init__(name)           

配套视频课程,点击这里查看

获取更多资源请订阅

Python学习站