文档章节

Python基础-面向对象组合、继承、子类调父类

ZHAO_JH
 ZHAO_JH
发布于 2018/04/13 15:52
字数 1001
阅读 26
收藏 4

组合

多个数据属性通过一个类实例化的对象做关联

# -*- coding:utf8 -*-
class Forest:                               #定义总类结合-森林
    def __init__(self,other):               #定义类的属性
        self.other = other                          #总类中的类别
        self.addr = Animal()                        #把其它类别结合到总类中
        self.type = Plant()
class Animal:                               #定义的动物类
    def _animal(self):                          #定义的动物属性
        print("这是动物类别")
class Plant:                                #定义的植物类
    def _plant(self):                       #定义的植物属性
        print("这是植物类别")
P = Forest("测试")                          #总类实例化
print(P.other)                              #总类自定义类输出
P.addr._animal()                            #总类结合的其它类输出
测试
这是动物类别

继承

通过集成可以派生(衍生)出新的方法

单继承

# -*- coding:utf8 -*-
class Forest:                       #定义的父类
    def __init__(self,name):
        self.Name = name
    def action(self):
        print("%s是非常厉害的" %self.Name)
class Subclass(Forest):             #子类,(衍生)出新的类
    print("森林里边")
P = Subclass("猴子")                #实例化子类
P.action()                          #子类调用父类属性
森林里边
猴子是非常厉害的

多继承

# -*- coding:utf8 -*-
class Forest:                               #定义的父类1
    def __init__(self,name):
        self.Name = name
    def action1(self):
        print("%s是非常厉害的" %self.Name)
class Activity:                             #定义的父类2
    def __init__(self,obj):
        self.Obj = obj
    @staticmethod
    def action2(describe):
        print("非常的%s" %describe)
class Subclass(Forest,Activity):             #子类,(衍生)出新的类
    print("森林里边")

P = Subclass("猴子")                         #实例化子类
P.action1()                                  #调用父类1属性
P.action2("灵活")                            #调用父类2属性
森林里边
猴子是非常厉害的
非常的灵活

接口继承

父类规定子类必须要使用的类方法,方便程序归一化设计

接口继承示例

# -*- coding:utf8 -*-
import abc
class All_file(metaclass=abc.ABCMeta):       #父类定义的方法,限定子类使用方法
    @abc.abstractmethod
    def a(self):                             #限制子类方法1
        pass
    @abc.abstractmethod                 
    def b(self):                             #限制子类方法2
        pass
class new(All_file):                          #子类继承的方法使用,必须要实现父类方法,否则无法实例化
    def a(self):
        print("继承的类方法1")
    def b(self):
        print("继承的类方法2")
P = new()
P.a()
P.b()
继承的类方法1
继承的类方法2

继承顺序

特性

Python的类可以继承多个类,Java和C#中则只能继承一个类

Python的类如果继承了多个类,那么寻找方法有两种:深度优先广度优先

剖析

对于定义的每一个类,Python计算出一个方法解析顺序(MRO)列表,MRO列表就是所有基类的线性顺序列表。MRO列表的构造是通过一个C3线性化算法来实现的。

MRO列表准则

子类会先于父类被检查

多个父类会根据它们在列表中的顺序被检查

如果对下一个类存在两个合法的选择,则选择第一个父类

示例

继承顺序结果示例

# -*- coding:utf8 -*-
class A:
    def test(self):
        print("this is A")
class B(A):
    def test(self):
        print("this is B")
class C(A):
    def test(self):
        print("this is C")
class D(B,C):
    def test(self):
        print("this is E")

print(D.__mro__)
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)

子类调用父类

普通调用

# -*- coding:utf8 -*-
class A:
    def __init__(self,name,forest):
        self.name = name
        self.forest = forest
    def Brief (self):
        print("%s在%s~" %(self.name,self.forest))
class B(A):                                             #父类属性继承
    def __init__(self,name,forest,action):              #派生新的方法
        A.__init__(self,name,forest)                    #父类属性快捷引用
        self.action = action
    def Events(self):
        B.Brief(self)
        print("%s在%s里边%s~" % (self.name, self.forest,self.action))
P = B("猴子","森林","跳舞")
P.Events()
猴子在森林~
猴子在森林里边跳舞~

super()函数方法调用

#-*- coding:utf8 -*-
class A:
    def __init__(self,name,forest):
        self.name = name
        self.forest = forest
    def Brief (self):
        print("%s在%s~" %(self.name,self.forest))
class B(A):                                             #父类属性继承
    def __init__(self,name,forest,action):              #派生新的方法
        super().__init__(name,forest)                   #Python3调用父类属性方法
#       super(B,self).__init__(name,forest)             #Python2调用父类属性方法
        self.action = action
    def Events(self):
        B.Brief(self)
        print("%s在%s里边%s~" % (self.name, self.forest,self.action))
P = B("猴子","森林","跳舞")
P.Events()
猴子在森林~
猴子在森林里边跳舞~

© 著作权归作者所有

ZHAO_JH
粉丝 17
博文 203
码字总数 182453
作品 0
宝山
运维
私信 提问
Python是面向对象的语言吗?python编程

  Python虽然是解释型语言,但从设计之初就已经是一门面向对象的语言,对于Python来说一切皆为对象。正因为如此,在Python中创建一个类和对象是很容易的,当然如果习惯面向过程或者函数的写...

老男孩Linux培训
2018/06/08
8
0
python基础---面向对象编程

面向对象 面向过程与面向对象的对比: 面向过程:核心是过程二字,过程指的是问题的解决步骤,即先干什么再干什么,基于面向过程去设计程序就好比在设计一条流水线,是一种机械式的思维方式 ...

迟到的栋子
2018/07/01
0
0
Python - 进阶(持续更新 ing)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 https://blog.csdn.net/qq39437555/article/details/93867588 文章目录 Python - 面向对象 ...

桃子味儿的汽水~
08/23
0
0
Python3基础之学习笔记(七)-面向对象

文章目录 1. 面向对象 1. 面向对象 1.1 面向对象介绍 面向对象编程(Object Oriented Programming,OOP,面向对象程序设计),面向对象编程是一种编程方式,此编程方式需要使用 “类” 和 “...

GoldenKitten
01/15
0
0
掌握面向对象编程本质,彻底掌握OOP

面向对象基本概念 面向对象是一种编程范式。范式是指一组方法论。编程范式是一组如何组织代码的方法论。编程范式指的是软件工程中的一种方法学。 一些主流的编程范式: OOP - 面向对象编程 ...

bigstone2012
2018/07/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

springboot全家桶,集成shiro,rabbitmq,redis, mybatis,druid,swagger

搭建了一个SpringBoot的模板,下载即可作为单体应用的服务后台模板 项目地址:https://gitee.com/devilscode/springboot_template 项目集成框架 springboot 作为基础框架 shiro 权限管理 ra...

devils_os
35分钟前
7
0
云服务器的优势有哪些?

与传统的服务器相比,云服务器有多种显著的优势,因此近年来云服务器租用一直都很受消费者的欢迎。 那么云服务器都有哪些优势呢? 云服务器的稳定性很好 虚拟主机是很多用户建站的首选方案,这...

云漫网络Ruan
35分钟前
5
0
好程序员web前端学习路线分享CSS浮动-清除浮动篇

好程序员web前端学习路线分享CSS浮动-清除浮动篇,为什么要清除浮动   这里所说的清除浮动,并不是不要浮动了,而是清除浮动与浮动之间的影响。那么到底会有什么影响呢? 1.高度塌陷   ...

好程序员官方
46分钟前
5
0
我有酒,你有故事吗?

记录学习的每一秒,巨杉技术社区有奖征文全新启动! 如果, 你热爱数据技术,乐于尝(zhe)试(teng), 又喜欢写点什么~ 那么, 无论你是架构大佬,还是DBA大神, 只要你愿意通过文字分享你...

巨杉数据库
50分钟前
5
0
【Git】ignore文件不生效

简介 使用git的过程中, 某些文件可能不希望上传到服务器,例如日志、本地化配置等信息。这时候,我们可以通过配置.gitignore文件忽略这些文件的提交。 配置.gitignore 常见的配置如下: HELP...

Areya
52分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部