Python3学习之路~6.6 类的继承

时间:2023-01-30 16:37:58

Inheritance 继承

面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
通过继承创建的新类称为“子类”或“派生类”。
被继承的类称为“基类”、“父类”或“超类”。
继承的过程,就是从一般到特殊的过程。
要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。
在某些 OOP 语言中,一个子类可以继承多个基类。但是一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现。

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

Ø         实现继承是指使用基类的属性和方法而无需额外编码的能力;
Ø         接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力(子类重构爹类方法);
在考虑使用继承时,有一点需要注意,那就是两个类之间的关系应该是“属于”关系。例如,Employee 是一个人,Manager 也是一个人,因此这两个类都可以继承 Person 类。但是 Leg 类却不能继承 Person 类,因为腿并不是一个人。
抽象类仅定义将由子类创建的一般属性和方法。
OOP开发范式大致为:划分对象→抽象类→将类组织成为层次化结构(继承和合成) →用类与实例进行设计和实现几个阶段。

一个类可以派生出子类,在这个父类里定义的属性、方法自动被子类继承。继承简单举例:

#Author:Zheng Na

class Person:
def __init__(self,name,age):
self.name = name
self.age = age def eat(self):
print("%s is eating..." % self.name) def talk(self):
print("%s is talking..." % self.name) def sleep(self):
print("%s is sleeping..." % self.name) #继承
class Man(Person): # 子类可以继承父类的方法
# 子类可以定义自己的方法
def smoke(self):
print("%s is smoking..." % self.name) # 子类可以重构父类的方法
def sleep(self):
Person.sleep(self)
print("man is sleeping...") class Woman(Person):
def get_birth(self):
print("%s is born a baby..." % self.name) m1 = Man("Alex",21)
m1.eat() # Alex is eating...
m1.smoke() # Alex is smoking...
m1.sleep() # Alex is sleeping... man is sleeping... w1 = Woman("Cendy",23)
w1.get_birth() # Cendy is born a baby...
#w1.smoke() # Woman不能调用Man里面的方法,会报错:AttributeError: 'Woman' object has no attribute 'smoke'

对构造函数进行重构:

#Author:Zheng Na

class Person:
def __init__(self,name,age):
self.name = name
self.age = age def eat(self):
print("%s is eating..." % self.name) def talk(self):
print("%s is talking..." % self.name) def sleep(self):
print("%s is sleeping..." % self.name) #继承
class Man(Person):
# 对构造函数进行重构:给Man多传一个参数
# 注意:父类的参数也要都写上
def __init__(self,name,age,money):
#以下2种写法都是对的,但使用super的好处有2个,
# 一个是当父类Person名字变了的时候,子类Man只需要在继承的地方修改一次即可,不需要每个重构的方法都改一次;
# 另一个是当子类同时继承多个父类时,重构时 写法2 只需要写一遍即可,但是 写法1 需要写多遍(每个父类写一遍),使用super更省代码
# Person.__init__(self,name,age) # 写法1
super(Man,self).__init__(name,age) # 写法2 self.money = money m1 = Man("Alex",21,100)
print(m1.money) #

对于多继承,有的语言支持,有的语言不支持。比如说Python是支持多继承的,而java就是不支持多继承的。多继承举例:

#Author:Zheng Na

# class Person: #经典类
class Person(object): #新式类
def __init__(self,name,age):
self.name = name
self.age = age
self.friends = [] def eat(self):
print("%s is eating..." % self.name) def talk(self):
print("%s is talking..." % self.name) def sleep(self):
print("%s is sleeping..." % self.name) class Relation(object):
def makefriends(self,obj):
print("%s is making friends with %s" % (self.name,obj.name))
self.friends.append(obj) # 注意这里一定是obj而不是name #多继承
class Man(Person,Relation):#两个父类的执行顺序是从左到右
pass
class Woman(Person,Relation):
pass m1 = Man("Alex",21)
w1 = Woman("Cendy",23) m1.makefriends(w1) # Alex is making friends with Cendy
print(m1.friends) # [<__main__.Woman object at 0x00000000027C8BE0>]
print(m1.friends[0].name) # Cendy
w1.name = "Amy" #即使w1改名字了,m1交的朋友也还是w1
print(m1.friends[0].name) # Amy

通过“继承”(Inheritance)和“组合”(Composition)来实现继承举例:

#Author:Zheng Na

#object是所有类的基类
class School(object):#以后最好写新式类
def __init__(self,name,addr):
self.name = name
self.addr = addr
self.students = []
self.teachers = [] def enroll(self,stu_obj):
print("为 %s 学生办理注册手续" %stu_obj.name)
self.students.append(stu_obj) def hire(self,tch_obj):
print("雇佣新教师 %s " %tch_obj.name)
self.teachers.append(tch_obj) class SchoolMember(object):
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex def tell(self):
pass class Teacher(SchoolMember):
def __init__(self,name,age,sex,salary,course):
super(Teacher,self).__init__(name,age,sex)
self.salary = salary
self.course = course def tell(self):
print('''
----info of Teacher:%s----
Name:%s
Age:%s
Sex:%s
Salary:%s
Course:%s
'''%(self.name,self.name,self.age,self.sex,self.salary,self.course)) def teach(self):
print("%s is teaching %s course" % (self.name,self.course)) class Student(SchoolMember):
def __init__(self,name,age,sex,stu_id,grade):
super(Student,self).__init__(name,age,sex)
self.stu_id = stu_id
self.grade = grade def tell(self):
print('''
----info of Student:%s----
Name:%s
Age:%s
Sex:%s
Stu_id:%s
Grade:%s
'''%(self.name,self.name,self.age,self.sex,self.stu_id,self.grade)) def pay_tuition(self,amount):
print("%s has paid tuition for $%s" % (self.name,amount)) school = School("长安大学","西安")
t1 = Teacher("Steven",43,"M",10000,"Linux")
t2 = Teacher("Martin",28,"M",8000,"Python") s1 = Student("Amy",20,"F",1001,2)
s2 = Student("Bob",20,"M",1002,2) t1.tell()
s1.tell() school.enroll(s1)
school.enroll(s2)
school.hire(t1) print(school.students)
print(school.teachers)
school.teachers[0].teach() for stu in school.students:
stu.pay_tuition(6000)

Python3学习之路~6.6 类的继承的更多相关文章

  1. Python3学习之路~7&period;2 类的特殊成员方法

    1. __doc__ 表示类的描述信息 class Dog(object): """ 这个类是描述狗这个对象的 """ def func(s ...

  2. Python3学习之路~0 目录

    目录 Python3学习之路~2.1 列表.元组操作 Python3学习之路~2.2 简单的购物车程序 Python3学习之路~2.3 字符串操作 Python3学习之路~2.4 字典操作 Pytho ...

  3. Python3学习之路~8&period;5 SocketServer实现多并发

    前面几节我们写的socket都只能实现服务端与一个客户端通信,并不能实现服务端与多客户端同时通信.接下来我们就来学习一下如何实现服务端同时与多个客户端通信,即并发. Socket Server soc ...

  4. Python3学习之路~6&period;8 多态

    多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作.简单的说,就是一句话:允许将子类类型 ...

  5. 【OC学习-12】什么是类的继承?为什么要继承?以及继承里面的注意事项

    (1)怎样实现类的继承? //之前的继承根类,如类ASStudent继承自根类 @interface ASStudent:NSObject{ } @end //如今继承现有自己定义的类,如ASStud ...

  6. Python3学习之路~6&period;7 经典类和新式类的继承顺序

    在Python中,经典类(class Person:)和新式类(class Person(object):)的主要区别就是体现在多继承的顺序上. Python 2.x中默认都是经典类,只有显式继承了o ...

  7. Python3 学习第五弹:类与面向对象

    对于面向对象总是要提到,万物皆对象.好似博大精深的感觉. 接下来一起看看python的面向对象的例子 创建一个对象 class Person: type = 'person' def __init__ ...

  8. Python3学习之路~8&period;6 开发一个支持多用户在线的FTP程序-代码实现

    作业: 开发一个支持多用户在线的FTP程序 要求: 用户加密认证 允许同时多用户登录 每个用户有自己的家目录 ,且只能访问自己的家目录 对用户进行磁盘配额,每个用户的可用空间不同 允许用户在ftp s ...

  9. Python3学习之路~7&period;5 异常处理

    1.异常基础 在编程过程中为了增加友好性,在程序出现bug时一般不会将错误信息显示给用户,而是现实一个提示的页面,通俗来说就是不让用户看见大黄页!!! try: pass except Excepti ...

随机推荐

  1. 尝试用md编辑器写博客&comma; 内容为 jupyter笔记

    Matplotlib tutorial http://www.labri.fr/perso/nrougier/teaching/matplotlib/#introduction %matplotlib ...

  2. paip&period;快捷方式分组管理最佳实践ObjectDock

    paip.快捷方式分组管理最佳实践ObjectDock /////挑选:除了od,还有个Berokyo ,但是bk无crash..只能使用1月.. Jumplist_Launcher_v7.2_rep ...

  3. cocos2dx 读取json及解析

    ball.json 数据例如以下: { "entities": [ { "entity": { "TapOpposite": 0, &quo ...

  4. VBS基础篇 - Err对象

    Err对象是一个具有全局范围的内部对象,含有关于错误的所有信息.On Error Resume next 忽略运行时产生的所有错误On Error Goto 0 取消忽略错误措施主要方法有:Clear ...

  5. php设计模式:工厂模式

    php设计模式:工厂模式 意图: 定义一个用于创建对象的接口,让子类决定实例化哪一个类. 工厂模式实现: 工厂模式中任何创建对象的工厂类都要实现这个接口,实现接口的方法体中都要实现接口中的方法,它声明 ...

  6. 学大伟业 国庆Day2

    期望得分:30+100+0=130 实际得分:30+100+20=150 忍者钩爪 (ninja.pas/c/cpp) [问题描述] 小Q是一名酷爱钩爪的忍者,最喜欢飞檐走壁的感觉,有一天小Q发现一个 ...

  7. 稀疏矩阵 part 4

    ▶ 各种稀疏矩阵数据结构下 y(n,1) = A(n,m) * x(m,1) 的实现,GPU版本 ● MAT 乘法 __global__ void dotGPU(const MAT *a, const ...

  8. apk安装提示:Failure &lbrack;INSTALL&lowbar;FAILED&lowbar;DUPLICATE&lowbar;PERMISSION perm&equals;XXX&rsqb;

    近日,楼主在同一台手机上,同时安装同一个游戏的不同渠道包,add install后,提示:Failure [INSTALL_FAILED_DUPLICATE_PERMISSION perm=andro ...

  9. word文档重新打开后文档结构错乱

    word文档重新打开后文档结构错乱,然后通过如下方法解决了. OFFICE2007及以上.        在打开word的时候左下角会有提示word自动更新文档样式,按esc键取消,然后在大纲模式下任 ...

  10. Enduring Exodus CodeForces - 655C &lpar;二分&rpar;

    链接 大意: n个房间, 1为占用, 0为未占用, John要将k头奶牛和自己分进k+1个空房间, 求John距最远的奶牛距离的最小值 这种简单题卡了20min.... 显然对于固定的k+1个房间, ...