一、继承

子类可以继承父类的所有公有成员,但不能直接访问父类的私有成员,只能通过父类的公有方法间接访问私有属性或私有方法。

如: class DerviedClassName(BaseClassName1[,BaseClassName2,......]):

      语句1

      语句2

      .......

      语句N

公有属性既可以在类的内部进行访问,也可以在外部程序中使用。

派生类(子类)继承了基类(父类)的行为和属性之后,还可以增加某些特定的行为和属性。 

继承分为单继承和多继承

A、单继承

# -------------------------------------
# 继承:派生类可以继承父类的公有成员
# -------------------------------------
# 单继承
# 基类:员工
class Staff:
school = '一中' # 类变量,在该类及其子类的实例中共享

def __init__(self, name='', age=25, sex='男'):
# 成员变量(实例变量)通常都是在此方法中定义
self.__name = name # 姓名
self.__age = age # 年龄
self.__sex = sex # 性别

self.set_name(name) # 调用方法对参数的有效性进行验证,并完成初始化
self.set_age(age)
self.set_sex(sex)

def set_name(self, name):
print("Staff: mod_name!")
# isinstance():测试一个对象是否为str
if not isinstance(name, str):
print('Name must be string.')
# 如果数据不合法,就使用默认值
self.__name = ''
return

self.__name = name

def set_age(self, age):
if type(age) != int:
print('Age must be integer.')
self.__age = 25
return

self.__age = age

def set_sex(self, sex):
if sex not in ('男', '女'):
print("性别必须是:'男'或'女'")
self.__sex = '男'
return

self.__sex = sex

# 派生类:老师(继承父类的公有成员,但不能继承其私有成员)
class Teacher(Staff):
def __init__(self, name='', age=25, sex='男', phone=None, title=None):
# 调用基类的构造函数
# super(Teacher, self).__init__(name, age, sex)
# 调用父类(基类)方法的形式一
super().__init__(name,age,sex) # Python 3.x 中可以使用
# 调用父类(基类)方法的形式二
# Staff.__init__(self,name,age,sex)
# 增加子类特有的属性
self.phone = phone # 电话号码
self.title = title # 职称

# 公有方法 设置/修改电话号码
def set_phone(self, phone):
self.phone = phone
print("phone:", self.phone)

def mod_title(self, title):
self.title = title
print("New title is:", self.title)

# 实例化员工类
staff = Staff('张楠')
# 通过对象名访问类变量
print("所属学校:", staff.school)
# 通过公有方法,修改私有变量
staff.set_age(28)
# 打印对象的属性及值
print(staff.__dict__)

# 实例化教师类
teacher = Teacher('李茜')
# 通过类名访问类变量
print("所属学校:", Teacher.school)
# 设置电话号码
teacher.set_phone('13711710932')
# 修改职称
teacher.mod_title('优秀教师')
# 设置性别
teacher.set_sex('女')
# 打印对象的属性及值
print(teacher.__dict__)

B、多继承

# ---------------------------------------------
# 继承:子类不能直接访问父类的私有属性或私有方法
# ---------------------------------------------
# 多继承
# 基类1:员工
class Staff:
school = '一中' # 类变量,在该类及其子类的实例中共享

def __init__(self, age=25, sex='男'):
print("Staff__init__!")

self.__age = age # 成员变量(实例变量)通常都是在此方法中定义
self.__sex = sex

self.set_age(age) # 调用方法对参数的有效性进行验证,并完成初始化
self.set_sex(sex)

def modify_info(self):
print("Staff: modify_info! school:", self.school)

def set_age(self, age):
self.__age = age

def set_sex(self, sex):
self.__sex = sex

# 基类2:教师
class Teacher:
def __init__(self, name, subject=''):
print("Teacher__init__!")

self.__name = name
self.subject = subject # 科目

def modify_info(self):
print("Teacher: modify_info! name:", self.__name)

def set_subject(self, *subject):
self.subject = subject

# 派生类:高级教师(同时继承员工类和教师类)
class SeniorTeacher(Staff, Teacher):
def __init__(self, name='', age=25, sex='男', subject='', level=''):
# 调用基类构造方法初始化基类的私有数据成员
Staff.__init__(self, age, sex)
Teacher.__init__(self, name, subject)

self.level = level # 考核等级

def set_level(self, level):
self.level = level
print("New level is:", self.level)

# 实例化
s_teacher = SeniorTeacher('张默', age=28, sex='男', subject='物理', level='优秀')

# 设置年齡(继承于第一个基类)
s_teacher.set_age(30)

# 设置科目(继承于第二个基类)
s_teacher.set_subject('化学')

# 调用基类公有方法(两个基类都有此方法)
s_teacher.modify_info()

二、重写(不想要父类的某些特性,想拥有自己的特性)

如果从父类继承的方法不能满足子类的需求,可以在子类中重写父类的方法,这个过程称为方法的覆盖(override),也称为方法的重写。

# ---------------------------
# 重写
# ---------------------------
# 定义父类
class Father:
def __init__(self, name):
self.name = name
print("name: %s" % self.name)

def get_name(self):
return "Father's name:" + self.name

# 定义子类,继承父类
class Son(Father):
# 继承父类构造方法,并进行改写
def __init__(self, name):
# 调用父类方法的形式一
super(Son, self).__init__(name)
# super().__init__(name) # Python 3.x 中可以使用

# 调用父类方法的形式二
# Father.__init__(self, name)

# 然后再执行子类自己的一部分操作
self.name = name
print("Hello! Subclass's initialize function.")

# 重写get_name方法
def get_name(self):
return "Son's name:" + self.name

# 如果直接运行脚本,执行下面的代码
#如你叫小明.py,你在朋友眼中是叫小明,name,而在你自己眼中是name==mian,即小明.py
if __name__ == '__main__':
# 实例化子类
son = Son('Danny')
# 调用子类对象的方法
print(son.get_name())

python -- 面向对象编程(继承、重写)的更多相关文章

  1. Python 面向对象编程 继承 和多态

    Python 面向对象编程 继承 和多态 一:多继承性 对于java我们熟悉的是一个类只能继承一个父类:但是对于C++ 一个子类可以有多个父亲,同样对于 Python一个类也可以有多个父亲 格式: c ...

  2. Python面向对象编程——继承与派生

    Python面向对象编程--继承与派生 一.初始继承 1.什么是继承 继承指的是类与类之间的关系,是一种什么"是"什么的关系,继承的功能之一就是用来解决代码重用问题. 继承是一种创 ...

  3. python面向对象编程 继承 组合 接口和抽象类

    1.类是用来描述某一类的事物,类的对象就是这一类事物中的一个个体.是事物就要有属性,属性分为 1:数据属性:就是变量 2:函数属性:就是函数,在面向对象里通常称为方法 注意:类和对象均用点来访问自己的 ...

  4. Python 面向对象编程——继承和多态

    <基本定义>     在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超 ...

  5. python面向对象编程进阶

    python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 ...

  6. python面向对象编程学习

    python面向对象编程 基本概念理解 面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作 ...

  7. python面向对象(封装,继承,多态)

    python面向对象(封装,继承,多态) 学习完本篇,你将会深入掌握 如何封装一个优雅的借口 python是如何实现继承 python的多态 封装 含义: 1.把对象的属性和方法结合成一个独立的单位, ...

  8. 图解python | 面向对象编程

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/56 本文地址:http://www.showmeai.tech/article-det ...

  9. python 面向对象编程学习

    1. 问题:将所有代码放入一个py文件:无法维护 方案:如果将代码才分放到多个py文件,好处: 1. 同一个名字的变量互相不影响 2.易于维护 3.引用模块: import module 2.包:解决 ...

随机推荐

  1. .NET平台系列14 .NET5中的新增功能

    系列目录     [已更新最新开发文章,点击查看详细] .NET5中不包含的内容 尽管 .NET5 框架中提供了一组重要 API,但它并不包括过去20年左右开发的所有 API,但是.NET Stand ...

  2. node和gulp版本的坑

    现在node版本最新的稳定版在14+ 然后我在接手项目的时候使用gulp打包,怎么也打包不了,这个问题纠结了挺久,然后百度了下,发现版本的问题 node 12+ 以上的版本不兼容 gulp 3的版本 ...

  3. javaBean命名规范 get / set 后的首字母大写

    javaBean命名规范 Sun 推荐的命名规范 1 ,类名要首字母大写,后面的单词首字母大写 2 ,方法名的第一个单词小写,后面的单词首字母大写 3 ,变量名的第一个单词小写,后面的单词首字母大写 ...

  4. 深入理解java虚拟机笔记Chapter8

    运行时栈帧结构 栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈(Virtual Machine Stack)的栈元素.栈帧存储了方法 ...

  5. Qt中的多线程与线程池浅析+实例

    1. Qt中的多线程与线程池 今天学习了Qt中的多线程和线程池,特写这篇博客来记录一下 2. 多线程 2.1 线程类 QThread Qt 中提供了一个线程类,通过这个类就可以创建子线程了,Qt 中一 ...

  6. 屌炸天,像写代码一样写PPT,一个小工具解决

    此文已经废,请移步升级版博文: markdown写ppt (史上最全)

  7. JDK并发包二

    JDK并发包二 线程复用--线程池 在线程池中,总有那么几个活跃的线程,当程序需要线程时可以从池子中随便拿一个控线程,当程序执行完毕,线程不关闭,而是将这个线程退会到池子,等待使用. JDK提供了一套 ...

  8. Django(69)最好用的过滤器插件Django-filter

    前言   如果需要满足前端各种筛选条件查询,我们使用drf自带的会比较麻烦,比如查询书名中包含"国"字,日期大于"2020-1-1"等等诸如此类的请求,Djan ...

  9. Typescript学习总结

    typescript(以下简称TS)出来也有好长时间了,下面记录一下学习心得. 首先学这门语言前,请确保有以下基础知识: 扎实的javascript基础知识 es6的基础知识 面向对象编程的概念(没有 ...

  10. 面试侃集合 | DelayQueue篇

    面试官:好久不见啊,上次我们聊完了PriorityBlockingQueue,今天我们再来聊聊和它相关的DelayQueue吧. Hydra:就知道你前面肯定给我挖了坑,DelayQueue也是一个无 ...