python类的继承

目录

  • 一、概述 
  • 二、类的继承
    • 2.1 继承的定义
    • 2.2 构造函数的继承 
    • 2.3 子类对父类方法的重写
  • 三、类继承的事例
回到顶部

一、概述 

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

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

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

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

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

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

回到顶部

二、类的继承

2.1 继承的定义

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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,....)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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__()

2.3 子类对父类方法的重写

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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

  

回到顶部

三、类继承的事例

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
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]

  

(0)

相关推荐

  • Python学习—面向对象编程基础篇

    python面向对象编程已经学完了,有必要进行一下记录总结,加深一下理解,不然似懂非懂容易忘记:面向对象的知识点很多,其中面向对象的高级篇:元类,需要另外一篇博客来写,最后还要手撸一个简单版本的ORM ...

  • 面向对象: 理解python类的单继承与多继承

    俗话说"龙生龙凤生凤老鼠的孩子会打洞",每种动物都有各自的特性,比如 老鼠会打洞 猫会爬树 鲨鱼会游泳 不同种类有不同的天性.而在程序员的思维中,动物是对象, 天性是这个类方法或者 ...

  • python 类简述

    一个最简单的基本类如下: # -*- coding: utf-8 -*- class Sjtiqu(): def __init__(self,x): self.x=x def jibenmian(se ...

  • Java学习——34、类的继承

    面向对象四大特性:封装.继承.多态.抽象. 今天介绍继承. 继承是面向对象的核心特性,能够最大限度地实现代码复用. 1.  由继承派生类 继承允许在已有类的基础上创建新类. 创建的新类叫做子类(或派生 ...

  • 第10天:Python 类与对象

    在刚接触编程时,我们就了解到编程界有两大思想:面向过程与面向对象,Python 就是一门面向对象的语言,如果你了解过面向对象的思想,自然就知道面向对象思想包含两个基本概念:类与对象 ,下面我们就一起详 ...

  • 说说Python类中的self参数?

    公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助! 小猿会从最基础的面试题开始, ...

  • Python类和对象

    Python 语言在设计之初,就定位为一门面向对象的编程语言,"Python 中一切皆对象"就是对 Python 这门编程语言的完美诠释. 类和对象是 Python 的重要特征,相 ...

  • C 类的继承 派生类除了自己的成员变量和成员方法外,还可以继承基类的成员变量和成员方法

    #include <iostream> using namespace std; //类的继承 //定义一个动物类,对于动物来说,它应该具有吃.睡和呼吸的方法 class Animal { ...

  • Python类调用实例方法

    通过前面的学习,类方法大体分为3类,分别是类方法.实例方法和静态方法,其中实例方法用的是最多的.我们知道,实例方法的调用方式其实有2种,既可以采用类对象调用,也可以直接通过类名调用. 通常情况下,我们 ...

  • 不忘人类初心继承奋斗前行

    在人生的奋斗发展中,努力学习认识人类历史的教训,运行历史的教训,不忘人类初心继承奋斗前行. 我们要想运行人生伟大的旅途,必须从学习人类历史的教训开始,得到奋起人生发展的前途. 从学习人类历史教训中,启 ...