Python3学习之路~6.6 类的继承
Inheritance 继承
面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
通过继承创建的新类称为“子类”或“派生类”。
被继承的类称为“基类”、“父类”或“超类”。
继承的过程,就是从一般到特殊的过程。
要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。
在某些 OOP 语言中,一个子类可以继承多个基类。但是一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现。
继承概念的实现方式主要有2类:实现继承、接口继承。
一个类可以派生出子类,在这个父类里定义的属性、方法自动被子类继承。继承简单举例:
- #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 类的继承的更多相关文章
- Python3学习之路~7.2 类的特殊成员方法
1. __doc__ 表示类的描述信息 class Dog(object): """ 这个类是描述狗这个对象的 """ def func(s ...
- Python3学习之路~0 目录
目录 Python3学习之路~2.1 列表.元组操作 Python3学习之路~2.2 简单的购物车程序 Python3学习之路~2.3 字符串操作 Python3学习之路~2.4 字典操作 Pytho ...
- Python3学习之路~8.5 SocketServer实现多并发
前面几节我们写的socket都只能实现服务端与一个客户端通信,并不能实现服务端与多客户端同时通信.接下来我们就来学习一下如何实现服务端同时与多个客户端通信,即并发. Socket Server soc ...
- Python3学习之路~6.8 多态
多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作.简单的说,就是一句话:允许将子类类型 ...
- 【OC学习-12】什么是类的继承?为什么要继承?以及继承里面的注意事项
(1)怎样实现类的继承? //之前的继承根类,如类ASStudent继承自根类 @interface ASStudent:NSObject{ } @end //如今继承现有自己定义的类,如ASStud ...
- Python3学习之路~6.7 经典类和新式类的继承顺序
在Python中,经典类(class Person:)和新式类(class Person(object):)的主要区别就是体现在多继承的顺序上. Python 2.x中默认都是经典类,只有显式继承了o ...
- Python3 学习第五弹:类与面向对象
对于面向对象总是要提到,万物皆对象.好似博大精深的感觉. 接下来一起看看python的面向对象的例子 创建一个对象 class Person: type = 'person' def __init__ ...
- Python3学习之路~8.6 开发一个支持多用户在线的FTP程序-代码实现
作业: 开发一个支持多用户在线的FTP程序 要求: 用户加密认证 允许同时多用户登录 每个用户有自己的家目录 ,且只能访问自己的家目录 对用户进行磁盘配额,每个用户的可用空间不同 允许用户在ftp s ...
- Python3学习之路~7.5 异常处理
1.异常基础 在编程过程中为了增加友好性,在程序出现bug时一般不会将错误信息显示给用户,而是现实一个提示的页面,通俗来说就是不让用户看见大黄页!!! try: pass except Excepti ...
随机推荐
- 深入探讨WPF的ListView控件
接上一篇博客初步探讨WPF的ListView控件(涉及模板.查找子控件) 我们继续探讨ListView的用法 一.实现排序功能 需求是这样的:假如我们把学生的分数放入ListView,当我 ...
- Android编译环境——ubuntu12.04上android2.3.4编译错误以及解决
Android编译环境——ubuntu12.04上android2.3.4编译错误以及解决 分类: android应用开发2013-08-21 09:20 4222人阅读 评论(3) 收藏 举报 li ...
- android中volley通信框架简介
1. 什么是Volley? 在这之前,我们在程序中需要和网络通信的时候,大体使用的东西莫过于AsyncTaskLoader,HttpURLConnection,AsyncTask,HTTPClient ...
- scala 模式匹配详解 3 模式匹配的核心功能是解构
http://www.artima.com/scalazine/articles/pattern_matching.html这篇文章是odersky谈scala中的模式匹配的一段对话,我做了部分片段翻 ...
- JQuery EasyUI DataGrid获取当前行
1.获取当前行索引 var rowIndex = $('#dg').datagrid('getRowIndex', row); 2.根据索引删除当前行 $('#dg').datagrid('delet ...
- logback logback.xml常用配置详解(一)<configuration> and <logger>
logback logback.xml常用配置详解(一)<configuration> and <logger> 博客分类: Log java loglogback 原创文章 ...
- day10 十 函数、形参和实参
一.形参和实参 1.形参:在函数定义()中出现的参数形参就是拷贝实参的值,随着函数的调用才产生,随着函数调用结束而销毁 def fn(a, b, c): print(a) print(b) print ...
- 壁虎书2 End-to-End Machine Learning Project
the main steps: 1. look at the big picture 2. get the data 3. discover and visualize the data to gai ...
- asp.net Ajax调用Aspx后台方法
Ajax调用的前提(以aspx文件为例:) 1.首先需要在aspx文件后台中引用using System.Web.Services; 2.需要调用的方法必须是公共的(public).静态的(stati ...
- IDEA入门
刚开始用IDEA会有很多不习惯 项目报错: Project build error: Non-resolvable parent POM for com.ks:my-springboot1:0.0.1 ...