一、继承

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

如: 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. 如何选择视觉CV光源颜色

    如何选择视觉CV光源颜色 一.光源颜色分类 光源颜色的选择对机器视觉光源有什么影响及意义呢,常用的光源颜色有白色(W).蓝色(B).红色(R).绿色(G).红外光(IR).紫外光(UV),这六种颜色. ...

  2. TcaplusDB祝大家端午安康!

    "五月五,端午到,赛龙舟,真热闹.吃粽子,带香包,蚊虫不来身边闹."这首脍炙人口.描绘着端午节风俗的儿歌,想必大家都听过. 每年的农历五月初五,是我国四大传统节日(春节.清明节.端 ...

  3. 最全JVM知识点思维导图,看这一篇就够了

    此处是转发别人的,别人花了二个月, 我花一天时间看完, 觉得很有用 https://www.processon.com/view/link/5eea141cf346fb1ae56a44e7

  4. go 技巧: 实现一个无限 buffer 的 channel

    前言 总所周知,go 里面只有两种 channel,一种是 unbuffered channel, 其声明方式为 ch := make(chan interface{}) 另一种是 buffered ...

  5. NX二次开发】Block UI 选择特征

    属性说明 属性   类型   描述   常规           BlockID    String    控件ID    Enable    Logical    是否可操作    Group    ...

  6. 【Azure 机器人】微软Azure Bot 编辑器系列(2) : 机器人/用户提问回答模式,机器人从API获取响应并组织答案 (The Bot Framework Composer tutorials)

    欢迎来到微软机器人编辑器使用教程,从这里开始,创建一个简单的机器人. 在该系列文章中,每一篇都将通过添加更多的功能来构建机器人.当完成教程中的全部内容后,你将成功的创建一个天气机器人(Weather ...

  7. ES6中的Map

    今天小编和大家一起探讨一下引用类型中的map,在其中会有一些map与数组联合应用,还有和map类似的weakmap类型的说明,这篇文章同时也增加了一些操作数组的办法和实际应用.大家也可以关注我的微信公 ...

  8. csp-s模拟测试41「夜莺与玫瑰·玫瑰花精·影子」

    夜莺与玫瑰 题解 联赛$T1$莫比乌斯$\%\%\%$ $dead$  $line$是直线 首先横竖就是$n+m$这比较显然 枚举方向向量 首先我们枚举方向向量时只枚举右下方向,显然贡献$*2$就是所 ...

  9. DOS命令行(9)——wmic-系统管理命令行工具

    wmic 介绍与语法 WMI(Windows Management Instrumentation,Windows 管理规范)是一项核心的 Windows 管理技术:用户可以使用 WMI 管理本地和远 ...

  10. ES6中的Module与Interator

    小编今天在用Vue做项目的时候,发现组件中有import和export,刚好今天看到相关的语法介绍和一些实例,下面小编就和大家一起进步.对于模块化规范,在es6出现之前,有以下三种规范,分别是Comm ...