一、继承

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

如: 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. 在Yolov5 Yolov4 Yolov3 TensorRT 实现Implementation

    在Yolov5 Yolov4 Yolov3 TensorRT 实现Implementation news: yolov5 support 引论 该项目是nvidia官方yolo-tensorrt的封装 ...

  2. RGB Color Codes Chart

    RGB Color Codes Chart RGB颜色空间 RGB颜色空间或RGB颜色系统,从红色.绿色和蓝色的组合中构造所有颜色. 红色.绿色和蓝色各使用8位,它们的整数值从0到255.这使得256 ...

  3. 硬件安全模块如何启用AUTOSAR

    硬件安全模块如何启用AUTOSAR How hardware security modules enable AUTOSAR 越来越复杂的软件和车内连接需要越来越多的加密保护.这种保护也必须由经典的实 ...

  4. 使用 Apache Superset 可视化 ClickHouse 数据

    Apache Superset是一个强大的BI工具,它提供了查看和探索数据的方法.它在 ClickHouse 用户中也越来越受欢迎. 我们将介绍安装 Superset 的 2 种方法,然后展示如何从 ...

  5. Kubernetes 实战——发现应用(Service)

    一.简介 服务:一种为一组功能相同的 Pod 提供单一不变的接入点的资源.服务 IP 和端口不会改变 对服务的连接会被路由到提供该服务的任意一个 Pod 上(负载均衡) 服务通过标签选择器判断哪些 P ...

  6. 工具篇:介绍几个好用的guava工具类

    前言 平时我们都会封装一些处理缓存或其他的小工具.但每个人都封装一次,重复造轮子,有点费时间.有没有一些好的工具库推荐-guava.guava是谷歌基于java封装好的开源库,它的性能.实用性,比我们 ...

  7. SpringBoot和Spring到底有没有本质的不同?

    现在的Spring相关开发都是基于SpringBoot的.最后在打包时可以把所有依赖的jar包都打进去,构成一个独立的可执行的jar包.如下图: 使用java -jar命令就可以运行这个独立的jar包 ...

  8. noip模拟7[匹配·回家·寿司]

    这次考试状态好像还是没有回来,只拿了55pts,还全是第一题的功劳,就是一个小KMP,然后还让我给打错了 就很难受,while打成了if,然后wa掉45分考完立马拿回来了,悔死了,害 第二题爆零了,为 ...

  9. redhat6版本网卡绑定做bond

    1.编写bond0配置文件 cd /etc/sysconfig/network-scripts(进入网卡配置文件路径) vi ifc-bond0(编辑bond0的配置文件,具体如下) DEVICE=b ...

  10. matplotlib 并列条形图

    1 绘制并列条形图,并在条形图上加标注 1.1 代码 from matplotlib import pyplot from matplotlib import font_manager import ...