python -- 面向对象编程(继承、重写)

一、继承

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

如: 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,即小明.pyif __name__ == ‘__main__‘:    # 实例化子类    son = Son(‘Danny‘)    # 调用子类对象的方法    print(son.get_name())

原文地址:https://www.cnblogs.com/Teachertao/p/11221356.html

时间: 2024-11-08 02:29:00

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

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

1.1   继承和多态 1.1.1   继承 当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类(Base class.Super class). >>> class Animal(object): ...    def run(self): ...        print('Animal is running...') #父类 ... >>> class Dog(Ani

python面向对象编程(OOP)

python作为一种解释性语言,其主要的编程方式就是面向对象,而且python的框架django也是主要面向对象的编程. 类(class)和对象(object) 类(class)是用来描述具有相同属性(attribute)和方法(method)对象的集合.对象(object)是类(class)的实例.比如学生都有名字和分数,他们有着共同的属性.这时我们就可以设计一个学生类,用来记录学生的名字和分数,并自定义打印出来. 属性(attribute):类里面用于描述所有对象共同特征的变量或数据.比如此

python面向对象编程进阶

python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 class Foo(object): 2 pass 3 4 obj = Foo() 5 6 isinstance(obj, Foo) issubclass(sub, super)检查sub类是否是 super 类的派生类 1 class Foo(object): 2 pass 3 4 class B

Python面向对象编程——简介

Python面向对象编程--简介 编程范式 编程是程序员用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程 . 一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大路通罗马,实现一个任务的方式有很多种不同的方式, 对这些不同的编程方式的特点进行归纳总结得出来的编程方式类别,即为编程范式. 不同的编程范式本质上代表对各种类型的任务采取的不同的解决问题的思路, 大多数语言只支持一种编程范式,当然也有些语言可以同时支持多种编程范式. 两种最重要的编程范式分别是面向

(转)Python 面向对象编程(一)

Python 面向对象编程(一) 虽然Python是解释性语言,但是它是面向对象的,能够进行对象编程.下面就来了解一下如何在Python中进行对象编程. 一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法. 类是对现实世界中一些事物的封装,定义一个类可以采用下面的方式来定义: class className: block 注意类名后面有个冒号,在block块里面就可以定义属性和方法了.当一个类定义完之后,就产生了一个类对象.类对象支持

Python面向对象编程总结(上)

在我学习python之前一直认为python是脚本型语言,不能用面相对象的方法进行编程,当我学习了python之后我发现我错了,python不但支持面相对象而且使用的人还挺多的.我从接触编程开始就是学习的Java语言,所以面相对象编程的思想在我的脑海里根深蒂固,让我一下从面向对象编程转换到面向过程编程还有一些不适应呢,所以我就来总结一下python面向对象编程的方法和过程.我将按照面向对象的构成要素来分析,依次为类和实例.属性.方法.封装.继承.多态,如果有什么问题还请大家积极指出,我所用的版本

Python面向对象编程-封装

1引言 你点击了桌面上的Chrome图标,一个浏览器窗口出现了,输入网址就可以在Internet世界愉快玩耍.这一切是怎么实现的呢?Chromium这个多进程的程序是如何启动各个进程的呢?浏览器主进程(界面进程)启动了哪些线程?如何启动的呢?这些问题一直萦绕在心头,一起来看看源代码吧.本文主要针对Chromium for Mac的源代码,其它操作系统大同小异. 2背景知识 浏览器作为一个应用程序,是以进程的形式运行在操作系统上的.首先,Chromium是一个多进程的应用程序,我们需要了解Chro

C++ Primer 学习笔记_69_面向对象编程 --继承情况下的类作用域

面向对象编程 --继承情况下的类作用域 引言: 在继承情况下,派生类的作用域嵌套在基类作用域中:如果不能在派生类作用域中确定名字,就在外围基类作用域中查找该名字的定义. 正是这种类作用域的层次嵌套使我们能够直接访问基类的成员,就好像这些成员是派生类成员一样: Bulk_item bulk; cout << bulk.book() << endl; 名字book的使用将这样确定[先派生->后基类]: 1)bulk是Bulk_item类对象,在Bulk_item类中查找,找不到名

python 面向对象编程(一)

一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法. 类是对现实世界中一些事物的封装,定义一个类可以采用下面的方式来定义: class className: block 注意类名后面有个冒号,在block块里面就可以定义属性和方法了.当一个类定义完之后,就产生了一个类对象.类对象支持两种操作:引用和实例化.引用操作是通过类对象去调用类中的属性或者方法,而实例化是产生出一个类对象的实例,称作实例对象.比如定义了一个people类: cl