python 子类重写父类的方法

  • Post author:
  • Post category:python


子类拓展了父类,子类是一种特殊的父类,大部分时候,子类总是以父类为基础,额外增加新的方法,但有一种情况例外,子类需要重写父类的方法,见代码:

class Animal:
    def eat(self):
        print('kkkkkk')

class Person(Animal):
    def eat(self):
        print('hhhhhhhh')
        return '这是子类的方法'

p = Person()
print(p.eat())    #   hhhhhhhh
                    #这是子类的方法

这种子类与父类同名的方法的现象被称为方法重写,也被称为方法覆盖,可以说子类重写了父类的方法,也可以说子类覆盖了父类的方法。



使用未绑定方法调用被重写方法

在通过类名调用实例方法时,python不会为实例方法的第一个参数self自动绑定参数值,而是需要程序显式绑定第一个参数self,这种机制被称为未绑定方法。

class Base(object):
    def foo(self):
        print('父类中定义的foo方法')
class Sub(Base):
    def foo(self):
        print('子类重写父类中的foo 方法')
    def bar(self):
        print('执行bar方法')
        self.foo()   # 直接执行foo方法,将会调用子类重写之后的foo()方法
        Base.foo(self)    #使用类名调用实例方法(未绑定方法)调用父类被重写的方法
b = Sub()
b.bar()

python的子类会继承得到父类的构造方法,如果子类有多个父类,那么排在前面的父类的构造方法优先被调用,那么其对应的实例变量(构造方法中参数的个数)可能就会发生改变



使用super()函数

class super(object):
    """
    super() -> same as super(__class__, <first argument>)
    super(type) -> unbound super object
    super(type, obj) -> bound super object; requires isinstance(obj, type)
    super(type, type2) -> bound super object; requires issubclass(type2, type)
    Typical use to call a cooperative superclass method:
    class C(B):
        def meth(self, arg):
            super().meth(arg)
    This works for class methods too:
    class C(B):
        @classmethod
        def cmeth(cls, arg):
            super().cmeth(arg)
    """

super其实就是一个类,因此调用super的本质就是super类的构造方法来创建super对象,使用super函数最常用的做法就是不传入任何参数,然后通过super对象的方法既可以调用父类的实例方法,也可以父类的类方法,在调用父类的实例方法时,程序会完成第一个参数self的自动绑定,在调用类方法时,程序会完成第一个参数cls的自动绑定

class Base(object):
    def foo(self):
        print('父类中定义的foo方法',end=' ')
class Sub(Base):
    def foo(self):
        super().foo()
        print('子类重写父类中的foo 方法')
b = Sub()
b.foo()     #   打印  父类中定义的foo方法 子类重写父类中的foo 方法

无论采用未绑定方法还是super()函数调用方法,父类中的方发优先被执行,然后执行子类中重写的方法

构造函数的重写仍然遵从这两个方法,代码如下:

class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age
        self.money = 1000

    def test(self):
        print(self.name + ' say hello')


class Student(Person):
    def __init__(self, name, age, school):
        # 子类在父类的基础上又扩展了自己的功能
        # 父类名.函数名(参数)
        # Person.__init__(self, name, age)

        # super().函数名()
        super().__init__(name, age)
        self.school = school

    def study(self):
        print('学生正在学习')

    def test(self):
        # Person.test(self)
        super().test()
        print('hehe')


s = Student('zhangsan', 18, '春田花花幼稚园')
print(s.money)
s.test()
# s.study()



版权声明:本文为weixin_43229819原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。