零基础入门python3.7 ——基础知识总结(二十三) 重写父类的方法和super()函数

一。重写父类的方法

由于存在继承机制。所以子类可以继承父类的所有属性和方法。但是在有些情况下子类从父类继承的方法中,大部分是适合子类使用的。 但是有一部分方法不能直接照搬父类的。如果不对这些方法修改。那么子类是无法使用的。 所以需要在子类中重复父类的方法。

  • 示例

对于所有的母鸡来说都可以行走。 而且都有翅膀。而且可以下蛋。

class Hen:
    def LayAEegg(self):
        print("我会下蛋")

    def wing(self):
        print("我有翅膀")

    def fly(self):
        print("我会飞")

对于公鸡来说它并不会下蛋。 所以在继承母鸡方法的同时还要对下蛋这个方法进行修改

class Hen:
    def LayAEegg(self):
        print("我会下蛋")

    def wing(self):
        print("我有翅膀")

    def fly(self):
        print("我会飞")

class Cock(Hen):
    def fly(self):
        print("我不会下蛋")
  • 重写,有时又称覆盖  是一个意思,指的是对类中已有方法的内部实现进行修改。
class Hen:
    def LayAEegg(self):
        print("我会下蛋")

    def wing(self):
        print("我有翅膀")

    def fly(self):
        print("我会飞")

class Cock(Hen):
    def fly(self):
        print("我不会下蛋")

a = Cock()
a.fly()

我不会下蛋
  • 如果从子类中重写了从父类中继承来的方法。当在类的外部通过子类对象调用该方法时 ,那么总会执行子类中重写的方法。那么也就意味着无法调用父类中的方法了。其实不然。类可以看作是一个独立的空间,那么也就意味着类方法也就是该空间中的一个函数。那么在全局中如果要调用类中的方法。只需要在调用函数时准备类名就可以了。
class Hen:
    def LayAEegg(self):
        print("我会下蛋")

    def wing(self):
        print("我有翅膀")

    def fly(self):
        print("我会飞")

class Cock(Hen):
    def fly(self):
        print("我不会下蛋")

a = Cock()
Hen.fly(a)

我会飞
  • 使用类名调用方法时不会绑定self。所以要手动绑定。

二。 super()函数

既然子类可以继承父类所有的属性和方法。那么父类的构造函数也不例外,除此之外python的多继承的语言。如果一个子类同时继承了多个父类的同名的类实例方法。则子类对象中调用该方法时。则会优先选择排在前面的父类中的实例方法。 构造方法也遵循这样的原则。

class Person:
    def __init__(self, name):
        self.name = name

    def getName(self):
        print(self.name)


class Person1:
    def __init__(self, age):
        self.age = age

    def getAge(self):
        print(self.age)


class Person2(Person, Person1):
    pass

a =Person2("小王")

a.getName()
a.getAge()


小王
Traceback (most recent call last):
  File "/Users/apple/Documents/重要文件/python3/python21.py", line 23, in 
    a.getAge()
  File "/Users/apple/Documents/重要文件/python3/python21.py", line 14, in getAge
    print(self.age)
AttributeError: 'Person2' object has no attribute 'age'

鉴于这种情况正确的做法是,定义子类中自己的构造方法。但是值得注意的是。在子类中定义构造方法。则必须在该方法中调用父类的构造方法。分为两种情况,

  • 类可以看作一个独立的空间。在类的外部调用类中的实例方法。可以像调用普通函数一样。区别在于要手动绑定类名。
  • 使用 super() 函数。但是一旦涉及到多继承。该函数只能调用第一个直接父类的构造方法
class Person:
    def __init__(self, name):
        self.name = name

    def getName(self):
        print(self.name)


class Person1:
    def __init__(self, age):
        self.age = age

    def getAge(self):
        print(self.age)


class Person2(Person, Person1):
    def __init__(self, name, age):
        # 通过super()调用
        super().__init__(name)
        # 通过普通函数的方式调用  注意需要手动绑定参数
        Person1.__init__(self, age)

a = Person2("小王", 30)

a.getName()
a.getAge()

小王
30

 

你可能感兴趣的:(python)