继承的注意事项类属性案例练习 | 手把手教你入门Python之六十四

简介: 在Python中,继承可以分为单继承、多继承和多层继承。

上一篇:继承的使用 | 手把手教你入门Python之六十三
下一篇:Python2和Python3的区别 | 手把手教你入门Python之六十五

本文来自于千锋教育在阿里云开发者社区学习中心上线课程《Python入门2020最新大课》,主讲人姜伟。

继承的注意事项

在Python中,继承可以分为单继承、多继承和多层继承。
单继承:⼦类只继承⼀个⽗类
继承概念:⼦类⽤于⽗类的所有的⽅法和属性。
不使用继承:
image.png
使用继承:
image.png
继承语法:

class 类名(⽗类名):
    pass
  • ⼦类继承⾃⽗类,可以享受⽗类中已经封装好的⽅法,不需要再次定义
  • ⼦类中应该根据职责,封装⼦类特有的属性和⽅法。

继承的传递性

Dog类继承⾃Animal,XiaoTianQuan⼜继承⾃Dog类,那么XiaoTianQuan类就具有了Animal类⾥的所有属性和⽅法。

⼦类拥有⽗类以及⽗类的⽗类中封装的所有属性和⽅法。
思考:

XiaoTianQuan能否调⽤Animal的run()⽅法? XiaoTianQUan能够调⽤Cat⾥的⽅法?

多继承

⼦类可以拥有多个⽗类,并且具有所有⽗类的属性和⽅法。
image.png
语法格式:

class ⼦类名(⽗类名1,⽗类名2...)
    pass

多继承的使⽤注意事项

思考:

如果不同的⽗类中存在同名的⽅法,⼦类对象在调⽤⽅法时,会调⽤哪个⽗类的⽅法? 说明:开发中,应该尽量避免这种容易产⽣混淆的情况。如果多个⽗类之间存在同名的属性后者⽅法,应该尽量避免使⽤多继承。

image.png

Python中的MRO

  • Python中针对类提供了⼀个内置属性 __mro__ 可以⽤来查看⽅法的搜索顺序。
  • MRO 是 method resolution order 的简称,主要⽤于在多继承时判断⽅法属性的调⽤顺序。
print(C.__mro__)

输出结果:

(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
  • 在调⽤⽅法时,按照 __mro__ 的输出结果从左⾄右的顺序查找。
  • 如果再当前类中找到⽅法,就直接执⾏,不再向下搜索。
  • 如果没有找到,就顺序查找下⼀个类中是否有对应的⽅法,如果找到,就直接执⾏,不再继续向下搜索。
  • 如果找到了最后⼀个类,依然没有找到⽅法,程序就会报错。
class A(object):
    def demo_a(self):
        print('我是A类里的方法demo_a')
    
    def foo(self):
        print('我是A类里的foo方法')


class B(object):
    def demo_b(self):
        print('我是B类里的方法demo_b')

    def foo(self):
        print('我是B类里的foo方法')

    

# python里允许多继承
class C(A, B):  # 如果不写父类,python3以后,默认继承自object
    pass

c = C()
c.demo_a()  # 我是A类里的方法demo_a
c.demo_b()  # 我是B类里的方法demo_b

# 如果两个不同的父类有同名方法,有一个类属性可以查看方法的调用顺序
c.foo()  # 我是A类里的foo方法
print(C.__mro__)   # (<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)

私有属性继承特点

class Animal(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age
        self.__money = 1000
    
    def eat(self):
        print(self.name + '正在吃东西')

    def __test(self):
        print('我是Animal类里的test方法')


class Person(Animal):
    def __demo(self):
        print('我是Person里的私有方法')


p = Person('张三', 18)
print(p.name)  # 张三
p.eat()  # 张三正在吃东西
# p.__test()  # 出错
p._Person__demo()  # 自己类里定义的私有方法  对象名._类名__私有方法()
p._Animal__test()  # 我是Animal类里的test方法  可以通过 对象名._父类名__私有方法()调用

# 私有属性和方法,子类不会继承
# p._Person__test()  # 出错  父类的私有方法,子类没有继承
# print(p._Person__money)  # 出错
print(p._Animal__money)  # 1000

新式类和旧式(经典)类

# -*- coding:utf8-*-
# 手动指定Student类继承自object
class Student(object):
    pass

# 没有指定Dog的父类,python3里默认继承自object
class Dog:
    pass

object 是Python中所有对象的基类,提供了⼀些内置的属性和⽅法,可以时候⽤ dir 函数查看。

  • 新式类:以 object 为基类的类,推荐使⽤
  • 经典类:不以object为基类的类,不推荐使⽤
  • 在 Python3.x 以后定义类时,如果没有指定⽗类,这个类会默认继承⾃ object,所以,python3.x版本定义的类都是新式类。
  • 在Python2.x中定义类时,如果没有指定⽗类,则不会继承⾃object,这个类是一个经典类。

为了保证代码在Python2.x和Python3.x中都能够运⾏,在定义类时,如果⼀个类没有⽗类,建议统⼀继承⾃object

class 类名(object):
    pass

配套视频

相关文章
|
1天前
|
Python
python面型对象编程进阶(继承、多态、私有化、异常捕获、类属性和类方法)(上)
python面型对象编程进阶(继承、多态、私有化、异常捕获、类属性和类方法)(上)
14 0
|
1天前
|
索引 Python
python 格式化、set类型和class类基础知识练习(上)
python 格式化、set类型和class类基础知识练习
16 0
|
1天前
|
程序员 索引 Python
06-python数据容器-set(集合)入门基础操作
06-python数据容器-set(集合)入门基础操作
|
2天前
|
Python
[重学Python]Day 2 Python经典案例简单习题6个
[重学Python]Day 2 Python经典案例简单习题6个
6 0
|
7天前
|
JavaScript 前端开发 API
游戏开发入门:Python后端与Vue前端的协同工作方式
【4月更文挑战第11天】使用Python后端(Flask或Django)和Vue.js前端开发游戏变得流行,能提高开发效率和可维护性。本文指导如何构建这样的项目,包括设置环境、创建虚拟环境、搭建后端API及前端Vue组件,强调前后端协作和API接口的重要性。这种架构促进团队合作,提升代码质量和游戏体验。
|
8天前
|
机器学习/深度学习 人工智能 算法
机器学习基础:使用Python和Scikit-learn入门
【4月更文挑战第9天】本文介绍了使用Python和Scikit-learn进行机器学习的基础知识和入门实践。首先,简述了机器学习的基本概念和类型。接着,展示了如何安装Python和Scikit-learn,加载与处理数据,选择模型进行训练,以及评估模型性能。通过本文,读者可了解机器学习入门步骤,并借助Python和Scikit-learn开始实践。
|
10天前
|
机器学习/深度学习 数据可视化 数据挖掘
利用Python进行数据分析与可视化:从入门到精通
本文将介绍如何使用Python语言进行数据分析与可视化,从基础概念到高级技巧一应俱全。通过学习本文,读者将掌握Python在数据处理、分析和可视化方面的核心技能,为实际项目应用打下坚实基础。
|
数据库 Python
python面型对象编程进阶(继承、多态、私有化、异常捕获、类属性和类方法)(下)
## 封装,继承和多态 ## 1.封装 1、满足把内容封装到某个地方,另一个地方去调用封装的内容 2、使用初始化构造方法,或者使用self获取封装的内容 ## 2.继承 子类继承父类的属性和内容
133 0
|
Python
python面型对象编程进阶(继承、多态、私有化、异常捕获、类属性和类方法)(上)
## 封装,继承和多态 ## 1.封装 1、满足把内容封装到某个地方,另一个地方去调用封装的内容 2、使用初始化构造方法,或者使用self获取封装的内容 ## 2.继承 子类继承父类的属性和内容
128 0

热门文章

最新文章