一、继承

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

如: 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. JVM--你常见的jvm 异常有哪些? 代码演示:StackOverflowError , utOfMemoryError: Java heap space , OutOfMemoryError: GC overhead limit exceeded, Direct buffer memory, Unable_to_create_new_native_Thread, Metaspace

    直接上代码: public class Test001 { public static void main(String[] args) { //java.lang.StackOverflowErro ...

  2. springboot的restful风格获取请求中携带的参数

    http://localhost:8080/emp/1 有以上请求,我们controller要怎么获取请求中传递的参数1呢? 通过PathVariable注解,如下: @DeleteMapping(& ...

  3. 会点自动化就要25k? 现在年轻人这么浮躁吗

    面试中一问元素定位就对答如流.一问实际项目框架如何搭建就避重就轻.含糊其辞,这样的自动化实战能力也能拿25K?静待下文: 一.为什么现在自动化测试工资那么高呢? 结合现在的职场环境与企业用人需求,自动 ...

  4. 性能工具之linux三剑客awk、grep、sed详解

    前言 linux 有很多工具可以做文本处理,例如:sort, cut, split, join, paste, comm, uniq, column, rev, tac, tr, nl, pr, he ...

  5. Vue(6)v-on指令的使用

    v-on 监听事件 可以用 v-on 指令监听 DOM 事件,并在触发时运行一些 JavaScript 代码.事件代码可以直接放到v-on后面,也可以写成一个函数.示例代码如下: <div id ...

  6. 手把手教你IDEA连接码云(Gitee)

    目录 前言 一.下载.安装git 1.打开git官网,选择你的操作系统 2.根据你的系统位数选择相应的版本下载 3.安装 4.配置全局的用户名.邮箱 5.在idea中配置git目录 二.配置Gitee ...

  7. 基于Istio构建微服务安全加固平台的探索

    简介 An open platform to connect, secure, control and observe services. Istio 是一个由谷歌.IBM 与Lyft共同开发的开源项 ...

  8. 41、解决du与df统计不一致的解决方法

    41.1.案例说明: 通过df -hT和du -sh /.du -h --max-depth=1 /命令 发现磁盘的使用不量不一致,使用'df -hT'命令查看磁盘的使用量要 比使用'du -sh / ...

  9. solidity 小案例 收费站

    solidity IDE下载地址 https://pan.baidu.com/s/1cY8VgDqB9Wt9VzK-Nocbyw 代码案例: pragma solidity ^0.4.0; //创建合 ...

  10. C. Learning Languages 求联通块的个数

    C. Learning Languages 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring&g ...