博文配套视频课程:24小时实现从零到AI人工智能
对象继承实现
面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。通过继承创建的新类称为子类或派生类,被继承的类称为基类、父类或超类
class Animal():
# 特殊方法,主要完成对象创建赋值
def __init__(self, age):
# 下划线开始和结束的方法,属性我们称为特殊方法和特殊属性
# 单下划线开始受保护的属性或者方法(本身和子类才能访问),双下划线开始则私有属性(自己才能访问)
self.age = age
def show(self):
print(f'年龄为:{self._age}')
# 定义子类(Dog),它继承动物类, Python支持多继承
class Dog(Animal):
# 子类可能也有自己的属性
def __init__(self, name, age):
# super代表的是被继承的父类
# 父类的属性要通过父类初始化方法来完成
super().__init__(age)
self.name = name
# 如果当前模块主模块,则返回为__main__,否则返回当前模块路径
if __name__ == "__main__":
animal = Animal(10)
animal.show()
# 创建一个子类的对象
dog = Dog('旺财', 3)
# 子类的对象无条件使用父类的方法,但是父类方法并不能输出name属性值
dog.show()
子类重写父类方法
如果你的父类方法的功能不能满足你的需求,你可以在子类重写你父类的方法
# 定义子类(Dog),它继承动物类, Python支持多继承
class Dog(Animal):
# 子类可能也有自己的属性
def __init__(self, name, age):
# super代表的是被继承的父类
# 父类的属性要通过父类初始化方法来完成
super().__init__(age)
self.name = name
# 如果父类的方法不适合子类,则子类可以重新定义(重写)
# 子类的方法名称,参数都必须和父类相同
# 根据就近原则
def show(self):
print(f'年龄为:{self._age},姓名为:{self.name}')
# 如果当前模块主模块,则返回为__main__,否则返回当前模块路径
if __name__ == "__main__":
# 创建一个子类的对象
dog = Dog('旺财', 3)
# 子类的对象无条件使用父类的方法
dog.show() # 年龄为:3,姓名为:旺财
私有与保护属性
那种仅限从一个对象内部访问的“私有”实例变量在 Python 中并不存在。 但是,大多数 Python 代码都遵循这样一个约定:带有一个下划线的名称 (例如 _age) 则是受保护的属性,只有当前类和子类可以访问
class Animal():
# 特殊方法,主要完成对象创建赋值
def __init__(self, age):
# 单下划线开始受保护的属性或者方法(本身和子类才能访问),双下划线开始则私有属性(自己才能访问)
self._age = age
def show(self):
print(f'年龄为:{self._age}')
# 定义子类(Dog),它继承动物类, Python支持多继承
class Dog(Animal):
# 子类可能也有自己的属性
def __init__(self, name, age):
# super代表的是被继承的父类
# 父类的属性要通过父类初始化方法来完成
super().__init__(age)
self.name = name
# 如果父类的方法不适合子类,则子类可以重新定义(重写)
# 子类的方法名称,参数都必须和父类相同
# 根据就近原则
def show(self):
print(f'年龄为:{self._age},姓名为:{self.name}')
# 如果当前模块主模块,则返回为__main__,否则返回当前模块路径
if __name__ == "__main__":
# 创建一个子类的对象
dog = Dog('旺财', 3)
# 子类的对象无条件使用父类的方法
dog.show() # 年龄为:3,姓名为:旺财