子类拓展了父类,子类是一种特殊的父类,大部分时候,子类总是以父类为基础,额外增加新的方法,但有一种情况例外,子类需要重写父类的方法,见代码:
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 版权协议,转载请附上原文出处链接和本声明。