python类的继承

Bill78 等级 235 0 0

一、概述 

  面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。

  通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”,继承的过程,就是从一般到特殊的过程。在某些 OOP 语言中,一个子类可以继承多个基类。但是一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现。

  继承概念的实现方式主要有2类:实现继承、接口继承。

  1. 实现继承是指使用基类的属性和方法而无需额外编码的能力。
  2. 接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力(子类重构爹类方法)。

  在考虑使用继承时,有一点需要注意,那就是两个类之间的关系应该是“属于”关系。例如,Employee 是一个人,Manager 也是一个人,因此这两个类都可以继承 Person 类。但是 Leg 类却不能继承 Person 类,因为腿并不是一个人。

  OO开发范式大致为:划分对象→抽象类→将类组织成为层次化结构(继承和合成) →用类与实例进行设计和实现几个阶段。

二、类的继承

2.1 继承的定义

class Person(object):   # 定义一个父类

    def talk(self):    # 父类中的方法
        print("person is talking....")   


class Chinese(Person):    # 定义一个子类, 继承Person类

    def walk(self):      # 在子类中定义其自身的方法
        print('is walking...')

c = Chinese()
c.talk()      # 调用继承的Person类的方法
c.walk()     # 调用本身的方法

# 输出

person is talking....
is walking...

2.2 构造函数的继承

  如果我们要给实例 c 传参,我们就要使用到构造函数,那么构造函数该如何继承,同时子类中又如何定义自己的属性?

继承类的构造方法:

    1.经典类的写法: 父类名称.\_\_init\_\_(self,参数1,参数2,...)

    2. 新式类的写法:super(子类,self).\_\_init\_\_(参数1,参数2,....)
class Person(object):

    def \_\_init\_\_(self, name, age):
        self.name = name
        self.age = age
        self.weight = 'weight'

    def talk(self):
        print("person is talking....")


class Chinese(Person):

    def \_\_init\_\_(self, name, age, language):  # 先继承,在重构
        Person.\_\_init\_\_(self, name, age)  #继承父类的构造方法,也可以写成:super(Chinese,self).\_\_init\_\_(name,age)
        self.language = language    # 定义类的本身属性

    def walk(self):
        print('is walking...')


class American(Person):
    pass

c = Chinese('bigberg', 22, 'Chinese')

  如果我们只是简单的在子类Chinese中定义一个构造函数,其实就是在重构。这样子类就不能继承父类的属性了。所以我们在定义子类的构造函数时,要先继承再构造,这样我们也能获取父类的属性了。

  子类构造函数基础父类构造函数过程如下:

  实例化对象c ----> c 调用子类\_\_init\_\_()  ---- > 子类\_\_init\_\_()继承父类\_\_init\_\_()  ----- > 调用父类 \_\_init\_\_()

  ![](https://img-hello-world.oss-cn-beijing.aliyuncs.com/328e29bc1aad79df4acaf164c3d8ff77.png)

2.3 子类对父类方法的重写

  如果我们对基类/父类的方法需要修改,可以在子类中重构该方法。如下的talk()方法 

class Person(object):

    def \_\_init\_\_(self, name, age):
        self.name = name
        self.age = age
        self.weight = 'weight'

    def talk(self):
        print("person is talking....")

class Chinese(Person):

    def \_\_init\_\_(self, name, age, language):  
        Person.\_\_init\_\_(self, name, age)  
        self.language = language
        print(self.name, self.age, self.weight, self.language)

    def talk(self):  # 子类 重构方法
        print('%s is speaking chinese' % self.name)

    def walk(self):
        print('is walking...')

c = Chinese('bigberg', 22, 'Chinese')
c.talk()

# 输出
bigberg 22 weight Chinese
bigberg is speaking chinese

三、类继承的事例

class SchoolMember(object):
    '''学习成员基类'''
    member = 0

    def \_\_init\_\_(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex
        self.enroll()

    def enroll(self):
        '注册'
        print('just enrolled a new school member \[%s\].' % self.name)
        SchoolMember.member += 1

    def tell(self):
        print('----%s----' % self.name)
        for k, v in self.\_\_dict\_\_.items():
            print(k, v)
        print('----end-----')

    def \_\_del\_\_(self):
        print('开除了\[%s\]' % self.name)
        SchoolMember.member -= 1


class Teacher(SchoolMember):
    '教师'
    def \_\_init\_\_(self, name, age, sex, salary, course):
        SchoolMember.\_\_init\_\_(self, name, age, sex)
        self.salary = salary
        self.course = course

    def teaching(self):
        print('Teacher \[%s\] is teaching \[%s\]' % (self.name, self.course))


class Student(SchoolMember):
    '学生'

    def \_\_init\_\_(self, name, age, sex, course, tuition):
        SchoolMember.\_\_init\_\_(self, name, age, sex)
        self.course = course
        self.tuition = tuition
        self.amount = 0

    def pay\_tuition(self, amount):
        print('student \[%s\] has just paied \[%s\]' % (self.name, amount))
        self.amount += amount

t1 = Teacher('Wusir', 28, 'M', 3000, 'python')
t1.tell()
s1 = Student('haitao', 38, 'M', 'python', 30000)
s1.tell()
s2 = Student('lichuang', 12, 'M', 'python', 11000)
print(SchoolMember.member)
del s2

print(SchoolMember.member)



# 输出
----end-----
just enrolled a new school member \[haitao\].
----haitao----
age 38
sex M
name haitao
amount 0
course python
tuition 30000
----end-----
just enrolled a new school member \[lichuang\].
3
开除了\[lichuang\]
2
开除了\[Wusir\]
开除了\[haitao\]

本文转自 https://www.cnblogs.com/bigberg/p/7182741.html,如有侵权,请联系删除。

收藏
评论区

相关推荐

python中的异常处理
异常 异常就是程序运行时发生错误的信号,在python中,错误触发的异常如下 异常种类   在python中不同的异常可以用不同的类型(python
2. 无门槛学会数据类型与输入、输出函数,滚雪球学 Python
学习一门语言应该是一件充满乐趣的事情,为什么要把它变难呢? 二、Python 基本数据类型与输入、输出函数 2.1 基本数据类型 对于任何一门语言都存在一些基本类型,Python 也不例外,只不过数据类型在 Python 中要远远比其他语言简单,基本分为以下几种。 1. 数值数据类型,常见的是整数和浮点数 2. 布尔值数据类型,就是常说的真和假
4. 列表一学完,Python 会一半,滚雪球学 Python
滚雪球学 Python,目标就是让 Python 学起来之后,越滚越大。 四、列表一学完,Python 会一半 4.1 列表是个啥 列表,先记住英文为 list ,它是 Python 中一种可以动态添加删除内容的数据类型,由一系列的元素组成。直白点说列表是将多个变量组合在一起的那么一个容器。 很多文章会找一个与列表相似的编程概念,一般会说 P
Python入门之类(class)
Python3 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的。本章节我们将详细介绍Python的面向对象编程。 如果你以前没有接触过面向对象的编程语言,那你可能需要先了解一些面向对象语言的一些基本特征,在头脑里头形成一个基本的面向对象的概念,这样有助于你更容易的学习Python的面向对
python类的继承
一、概述    面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。   通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”,继承的过程,就是从一般到特殊的过程。在某些 OOP 语言中,一个子类可以继
Python的新式类和旧式类
概述: Python中支持多继承,也就是一个子类可以继承多个父类/基类。当一个调用一个自身没有定义的属性时,它是按照何种顺序去父类中寻找的呢?尤其是当众多父类中都包含有同名的属性,这就涉及到新式类 和 经典类的区别。 多继承: class Food(object): 2 3 def __init__(self, name, col
Python新式类与经典类(旧式类)的区别
Python新式类与经典类(旧式类)的区别 Python中类分两种:旧式类和新式类: ➤新式类都从object继承,经典类不需要。 ➤新式类的MRO(method resolution order 基类搜索顺序)算法采用C3算法广度优先搜索,而旧式类的MRO算法是采用
NumPy数值计算基础(超详细的numpy使用方法)
NumPy数值计算基础 NumPy是在1995年诞生的Python库Numeric的基础上建立起来的,但真正促使NumPy的发行的是Python的SciPy库。但SciPy中并没有合适的类似于Numeric中的对
商业数据分析从入门到入职(8)Python模块、文件IO和面向对象
前言本文先介绍了Python中程序、模块和包的基本使用,并在此基础上介绍了Python标准库。然后详细介绍了Python中的文件IO操作,包括文本文件、二进制文件的读写和其他IO操作。最后介绍了面向对象,包括类的定义、继承的使用、鸭子类型和魔法方法。 一、程序、模块和包 1.自定义模块和包之前我们使用的.ipynb文件都不是纯Python文件,
Python初学者必备书籍《Python入门经典》高清PDF版|百度网盘免费下载|Python初学者,自学Python必读
提取码:1028以及前文提到的学习路线图内容简介Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。Python可以用于很多的领域,从科学计算到游戏开发。《Python入门经典》是面向Python初学者的学习指南,详细介绍了Python编程基础,以及一些高级概念,如面向对象编程。全书分为24章。第1章介绍了Python的背景和安装方法。第2章
简述Python中常见的数据结构
「数仓宝贝库」,带你学数据!导读:Python中常见的数据结构有列表(list)、元组(tuple)、集合(set)、字典(dict)等,这些数据结构表示了自身在Python中的存在形式,在Python中可以输入type(对象)查看数据类型。 1列表 (1)创建列表 列表是Python内置的一种数据类型,它是一种有序的数据集合,是用于存储一连串
一篇文章带你了解Python运算符重载
您可以根据所使用的操作数来更改Python中运算符的含义。这种做法称为运算符重载,今天我们一起来聊聊运算符重载。 一、什么是Python中的运算符重载? Python运算符用于内置类。但是相同的运算符对不同的类型有不同的行为。例如,+运算符将对两个数字执行算术加法、合并两个列表并连接两个字符串。Python中的这一功能允许同一运算符根据上下文具有不同的含
一篇文章带你了解Python运算符重载
您可以根据所使用的操作数来更改Python中运算符的含义。这种做法称为运算符重载,今天我们一起来聊聊运算符重载。 一、什么是Python中的运算符重载? Python运算符用于内置类。但是相同的运算符对不同的类型有不同的行为。例如,+运算符将对两个数字执行算术加法、合并两个列表并连接两个字符串。Python中的这一功能允许同一运算符根据上下文具有不同的含
pandas创始人手把手教你利用Python进行数据分析(思维导图)
导读: Python是目前数据科学领域的王者语言,众多科学家、工程师、分析师都使用它来完成数据相关的工作。由于Python具有简单易学、语法灵活的特点,很多需要处理数据的人士想要学习,主要有两大类: 财经类、统计类背景人员,他们的日常工作有大量数据需要处理、分析,但对于学习使用计算机领域的编程语言Python又感到无从下手。 一些想要学习
Python基础1——变量、判断、循环、字符串、列表
1 认识python 1.1 认识python计算机识别机器语言,机器语言由二进制0和1组成计算机要执行高级语言,转换方式 1. 编译 : C语言、C++、java。 一次性编译成可执行文件2. 解释 : 一行一行地解释python是解释型语言python解释器、pycharm编辑器举个例子:要给工地煮饭编译:把饭菜都做好,做成盒饭(.exe,.class