埃尔法哥哥:Python编程教程:面向对象之高级特性( 三 )


# 子类新增方法:学习
def study(self):
print("学生学习啦 。。。 把你爸乐坏了 。。。。。 ")
# 创建父类对象 , 访问父类的方法
zhangsan = Person();
zhangsan.eat()
zhangsan.sleep()
# 创建子类对象 , 访问父类的方法和子类的方法
ergou = Student();
ergou.eat() # 访问父类的方法
ergou.sleep() # 访问父类的方法
ergou.study() # 访问子类的新增方法
3.3.2 继承中的 __init__() 的调用规则
如果子类没有手动 __init__() 方法, 则 python 自动调用子类的 __init__() 的时候, 也会自动的调用基类的 __init()__ 方法.
class Father:
def __init__(self):
print("基类的 init ")
# Son继承 Father 类
class Son(Father):
def speak(self):
pass
s = Son()
如果子类手动添加了 __init__() , 则 python 不会再自动的去调用基类的 __init__()
class Father:
def __init__(self):
print("基类的 init ")
# Son继承 Father 类
class Son(Father):
def __init__(self):
print("子类的 init ")
def speak(self):
pass
s = Son()
如果想通过基类初始化一些数据, 则必须显示的调用这个方法, 调用语法是:
基类名.__init__(self, 参数...)
class Father:
def __init__(self, name):
print("基类的 init ")
self.name = name
def speak(self):
print("我是父类中的 speak 方法" + self.name)
# Son继承 Father 类
class Son(Father):
def __init__(self, name, age):
# name 属性的初始化应该交给基类去完成, 手动调用基类的方法. 一般放在首行
Father.__init__(self, name) # 调动指定类的方法, 并手动绑定这个方法的 self
print("子类的 init ")
self.age = age
s = Son("李四", 20)
s.speak()
print(s.name)
print(s.age)
3.4方法的重写(override)3.4.1重写的概念
我们已经了解了调用方法时候的查找规则, 先在子类中查找, 子类查找不到再去父类中查找.
如果父类的方法不满足子类的需求, 利用这个查找规则, 我们就可以在子类中添加一个与父类的一样的方法, 那么以后就会直接执行子类的方法, 而不会再去父类中查找.
这就叫方法的覆写.( override )
>重写 , 就是子类将父类已有的方法重新实现 。
父类封装的方法 , 不能满足子类的需求 , 子类可以重写父类的方法 。 在调用时 ,调用的是重写的方法 , 而不会调用父类封装的方法 。
3.4.2重写父类方法的两种情况
【埃尔法哥哥:Python编程教程:面向对象之高级特性】覆盖父类 的方法父类的方法实现和子类的方法实现 , 完全不同 , 子类可以重新编写父类的方法实现 。 具体的实现方式 , 就相当于在子类中定义了一个和父类同名的方法并且实现
对父类方法 进行扩展子类的方法实现中包含父类的方法实现 。 (也就是说 , 父类原本封装的方法实现是子类方法的一部分) 。 在子类中重写父类的方法在需要的位置使用 super().父类方法 来调用父类的方法代码其他的位置针对子类的需求 , 编写子类特有的代码实现 。
如果在覆写的方法中, 子类还需要执行父类的方法, 则可以手动调用父类的方法:
父类名.方法(self, 参数...)
class Father:
def __init__(self, name):
self.name = name
def speak(self):
print("我是父类中的 speak 方法" + self.name)
# Son继承 Father 类
class Son(Father):
def __init__(self, name, age):


推荐阅读