文档章节

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

ZHAO_JH
 ZHAO_JH
发布于 2018/04/13 15:52
字数 1001
阅读 27
收藏 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

没有更多内容

加载失败,请刷新页面

加载更多

Sqoop之导入Mysql数据到Hive出现ASCII

问题是这样的,从Mysql中导入数据到Hive中,Mysql中数据是"T2",到Hive中后,发现变为"54 32",咦,怎么乱码了,感觉这像ASCII编码。 现象有了,之前都没遇到过这样,觉得很奇怪,迅速找了下...

克虏伯
7分钟前
2
0
深度科技受邀参加鲲鹏计算产业峰会·海南

10月22日,华为及生态伙伴共同举办了以“鲲鹏展翅,力算未来 共赢多样性计算时代”为主题的“鲲鹏计算产业峰会•海南”,来自各领域的300多名行业客户、专家及生态伙伴齐聚一堂,共同分享计算...

后浪涛涛
9分钟前
3
0
【Android JetPack系列】LifeCycles

一、简介 Lifecycles 是一个持有组件生命周期状态(如活动或片段)信息的类,并允许其他对象观察此状态。 生命周期使用两个主要枚举来跟踪其关联组件的生命周期状态: Event:从 框架 和 Li...

Agnes2017
10分钟前
2
0
配置码云git自动更新的webhook

配置项目提交到git的时候自动同步服务器代码 一、在服务器项目跟目录新建文件hook.php 代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 <?php $json = file_get_contents("php://input"); $data ......

dragon_tech
16分钟前
2
0
一道题深度剖析this指向

< script > var num = 1 ; var myObject = { num : 2 , add : function (){ this . num = 3 ; ( function (){ // 这里的 this 是 window,因为自调用函数的调用者是windo,使用箭头函数则指向......

李超明
20分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部