返回顶部
首页 > 资讯 > 后端开发 > Python >8.python之面相对象part.3(
  • 164
分享到

8.python之面相对象part.3(

面相对象python 2023-01-31 06:01:10 164人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

在python这门编程语言中,一个类可以去继承一个父类甚至多个父类,只继承一个父类就是单继承,如果一个子类继承了多个父类,那么这就是多继承。原始类被称为“基类”(超类),继承了其他类的新式类被称为“子类”或“派生类”。一.如何实现类的继承。

python这门编程语言中,一个类可以去继承一个父类甚至多个父类,只继承一个父类就是单继承,如果一个子类继承了多个父类,那么这就是多继承。原始类被称为“基类”(超类),继承了其他类的新式类被称为“子类”或“派生类”。

一.如何实现类的继承。

接下来简单演示下什么是单继承和多继承。

class dad_1:

    pass

class dad_2:

    pass

#新建了两个父类dad_1和dad_2

class son_1(dad_1):  #单继承:只继承了一个父类

    pass

class son_2(dad_1,dad_2):  #多继承,同时继承了多个父类

    pass

print son_1.__bases__

>>>(<class __main__.dad_1 at 0x108b30870>,)

print son_2.__bases__

>>>(<class __main__.dad_1 at 0x107a6e870>, <class __main__.dad_2 at 0x107b661f0>)

注意!在这里要补充一点,就是,在Python中定义了一个类,如果这个类没有指定任何的父类,那么这个类默认会继承一个object类,这个object类是所有父类的“基类”。


二.一个子类会继承父类的哪些属性?

子类默认会继承父类所有的方法和属性,当然子类也可以添加自己新的属性或者在自己这里重新定义这些属性(不会影响到父类),需要注意的是,一旦重新定义了自己的属性且与父类重名,那么调用新增的属性时,就以自己为准了。

也就是说,当一个子类继承了一个父类的时候,子类或者是子类生成的对象,要找一个属性或者是一个方法,首先会在对象自己身上找,如果找不到,就回到这个对象所属的类中找,如果类中找不到,就会到这个类的父类中找,如果父类中也找不到,回到上一级父类中去找,如果找到基类还没有找到想要找的属性,或者方法,就报错了。


三.什么时候需要用继承?什么时候需要用组合?

首先先来说说什么时候比较适合用组合。(由多个小类组合成一个大的类。)

当每个小类之间差别很大,并且小类是大类所需要的组件的时候,使用组合是不错的选择。

(关于组合这个概念,博主还没想到很好的例子去演示,想到了后面的文章会补。。。)


那什么时候适合用继承呢?

当类之前就很多相似的功能,可以提取这些类所有相似的功能,去做成一个“基类”(父类),在这种情况下使用继承的特性比较好。


下面是个关于继承的例子:

class animal:   #首先定义了一个动物类。

    def eat(self):

        print "%s 吃" %(self.name)

    def drink(self):

        print "%s 喝" %(self.name)

    def shit(self):

        print "%s 拉屎" %(self.name)

    def pee(self):

        print "%s 撒尿" %(self.name)

class cat(animal):   #定义了一个cat类,这个cat类继承了animal动物类。

    def __init__(self,name):

        self.name = name

        self.type = 'cat'

    def say(self):

        print "miao~"

class dog(animal):  #定义了一个dog类,这个dog类也继承了animal动物类。

    def __init__(self,name):

        self.name = name

        self.type = "dog"

    def say(self):

        print "wang~"

cat1 = cat("小白")

dog1 = dog("crea")

cat1.eat()

cat.say()

通过上面的例子可以看到,cat类和dog类并没有定义eat,drink,pee,shit功能,这些功能都是名为从animal的父类中继承而来的。

所以说,在开发一个程序的时候,如果我们先定义了一个类a,然后又想建立一个类b,其中类b的大部分内容与类a相同的时候,我们不在需要从头写一个类b,大部分的属性和功能从类a中继承就好了。

通过继承的方式新建类B,让B继承A,B会‘遗传’A的所有属性(数据属性和函数属性),实现代码重用。


四.python多继承的继承顺序。

在python中,一个子类如果继承了多个父类,寻找属性和方法的方式有两种,分别是深度优先和广度优先。

当这个类是经典类时,多继承的情况下,会按照深度优先的方式进行查找。

当这个类是新式类时,多继承的情况下,会按照广度优先的方式进行查找。

上面这个深度优先的广度优先的图到底是什么意思呢?下面我来解释一下。

(下面的解释配合上图食用~)

深度优先(python2.x版本中的经典类的查找方式):A类分别继承了B类和C类,B类和C类又同时继承的D类,那他们查找属性和方法的方式是,A发现自己没有某个属性和方法时,首先会去查找自己的第一个父类,也就是B,当B这个中也没有相应的属性或者方法,接着也会去查找B类的父类,就是D类,D类已经是这些类的“基类”了,已经没有办法再向上找了,这时目光回到A 类,A同时还继承了一个C类,C类是A类的第二个父类,接下来就回去找C类,如果C类也没有这个属性和方法,就会去找C类的父类......以此类推,一级一级找下去。


广度优先(python2.x版本中的新式类,以及python3中所有类的查找方式):和上一个例子一样,A类分别继承了B类和C类,B类和C类又同时继承的D类,所谓广度优先,就是,当A发现自己没有某个属性和方法的时候,首先会去找自己的第一个父类,也就是B,当B类中也没有相应的属性或者方法时,此时不会像深度优先一样去找B类的父类,而时去找A自己继承的第二个父类!!C类,当C类中也没有该属性或方法的时候,此时才会去找B类的父类!这就是广度优先。


在这里重新的!重点强调一下经典类和新式类的概念!!!!!

在python2.x版本中!!当前类,或者父类继承了object类,那么这个类就是新式类。

class c1:   #经典类                                    class c1(object):  #新式类

    pass                                                            pass

class c2(c1): #经典类                              class c2(c1):     #新式类

    pass                                                              pass  

在python3版本中,所有的类都是新式类。(为什么python3中所有的类都是新式类呢,就是因为你定义一个类,如果这个类不继承任何父类,默认就会继承object类)


(重点)五.类继承的实现原理。

python内部是如何实现类继承的?

在python中定义的每一个类,python内部都会计算出一个方法解析的顺序,也就是一个mro列表,这个mro列表就是一个简单的,所有父类的顺序列表。

关于mro列表,可以看下面这个例子:

#!/usr/bin/python2.7

# -*- coding:utf-8 -*-

#class person:

 #   def __init__(self,career):

 #       self.career = career

 #   def show_carrer(self):

 #       print self.career

 #   def __del__(self):

#      print "obj_del!!!!!"

#ayumi = person("diva")

#ayumi.show_carrer()

#ayumi.__del__()

#print ayumi()

#import time

#class num:

#    count = 0

#    def __init__(self):

#        num.count += 1

#    def __del__(self):

#        num.count -= 1

#    @claSSMethod

#    def show_count(self):

#        return num.count

#    @staticmethod

#    def dis_time():

#        return time.localtime()

#a = num()

#b = num()

#print b.dis_time()

class A(object):

    def test(self):

        print('from A')

class B(A):

    def test(self):

        print('from B')

class C(A):

    def test(self):

        print('from C')

class D(B):

    def test(self):

        print('from D')

class E(C):

    def test(self):

        print('from E')

class F(D,E):

    # def test(self):

    #     print('from F')

    pass

f1=F()

f1.test()

print F.__mro__

>>>from D

(<class '__main__.F'>, <class '__main__.D'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.A'>, <type 'object'>)


为了实现类的继承,python会在类的mro列表上从左到右开始查找父类,直到找到匹配这个属性的类为止。

mro列表遵循下面三个原则:

1.子类会先于父类被检查

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

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

注意!!python中只有新式类才会有mro列表!经典类没这个东西!!


--结束END--

本文标题: 8.python之面相对象part.3(

本文链接: https://lsjlt.com/news/189323.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 8.python之面相对象part.3(
    在python这门编程语言中,一个类可以去继承一个父类甚至多个父类,只继承一个父类就是单继承,如果一个子类继承了多个父类,那么这就是多继承。原始类被称为“基类”(超类),继承了其他类的新式类被称为“子类”或“派生类”。一.如何实现类的继承。...
    99+
    2023-01-31
    面相 对象 python
  • python面相对象之类和对象
      类和对象是python面相对象中两个重要的概念,类是客观世界中事物的抽象,而对象是类实例后的变量,比如汽车模型可以造出各种各样的汽车,汽车模型就是类,汽车就是汽车模型抽象出来的实例,这里有必要还有说一下方法,函数在类中叫方法,比如汽车...
    99+
    2023-01-31
    对象 面相 python
  • #3 Python面向对象(二)
    前言 上一节主要记录面向对象编程的思想以及Python类的简单创建,这节继续深入类中变量的相关知识,Here we go! Python中类的各种变量 1.1 类变量 类变量定义:在类中,在函数体(方法)外的变量称为类变量。类变量在整个类...
    99+
    2023-01-30
    面向对象 Python
  • Scala 学习之面向对象(3)
    ==> 类        ---> 类的定义class Student{     // 定义属性     private var stuName:String = "Tom"     private vat stuAge:Int...
    99+
    2023-01-31
    面向对象 Scala
  • Python面向对象之类和对象
    目录类定义类定义类和属性类中方法对象方法(普通方法)类方法静态方法魔术方法对象创建对象对象属性总结 类 定义类 所有类名首字母要求大写,多个单词时遵循驼峰命名法 所...
    99+
    2024-04-02
  • 3.Python对象
    一.对象 Python 对象 : Python使用对象模型来存储数据.构造任何类型的值都是一个对象,. 尽管Python通常当成一种 "面向对象的编程语言" ,但是你完全能够写出不使用任何类和实例的实用脚本. 所有的Python对象都拥有...
    99+
    2023-01-31
    对象 Python
  • Python面向对象之成员相关知识总结
    一、成员  1.1 变量 实例变量,属于对象,每个对象中各自维护自己的数据。 类变量,属于类,可以被所有对象共享,一般用于给对象提供公共数据(类似于全局变...
    99+
    2024-04-02
  • javascript面向对象3
    函数 创建函数: function f(x){…..}; var f = function(x){…}; 上面两种形式都可以创建名为f()的函数,不过后一种形式可以创建匿名函数。        函数定义时可以设置参数。如果传给函数的参数个数...
    99+
    2023-01-31
    面向对象 javascript
  • Python面向对象之面向对象基本概念
    面向过程和面向对象概念 过程和函数:过程类似于函数,只能执行,但是没有返回结果;函数不仅能执行,还能返回结果。 面向过程和面向对象 基本概念 面向过程-怎么做 把完成某一个需求的所有步骤从头到尾逐步实现; 根据开发需求,将某些功能独立的...
    99+
    2023-01-31
    面向对象 基本概念 Python
  • Python面向对象之入门类和对象
    目录什么是面向对象编程?定义类,从具体代码来感受吧!多个类和对象的观察补充一下类的属性(数据部分)总结什么是面向对象编程? 我们是不是听过面向过程,拿来放在一起对比就比较好理解了。 ...
    99+
    2024-04-02
  • python 面向对象之继承
    文章目录 前言继承的概念单继承多继承子类重写父类的同名方法和属性子类调用父类同名的方法和属性多层继承私有权限 前言 前面我们已经学习了 python 面向对象的类和对象,那么今天我将为大...
    99+
    2023-09-01
    python 开发语言
  • python 面向对象之多态
    多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。那么,多态的...
    99+
    2023-01-30
    面向对象 多态 python
  • python 面向对象之变量
    类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。实例变量:定义在方法中的变量,只作用于当前实例的类。类变量的用途?大家公共的属性,节省开销看下面一段代码class Role...
    99+
    2023-01-30
    变量 面向对象 python
  • python之初始面向对象
    1. 初识面向对象   面向过程:     一切以事务的发展流程为中心.   面向对象:     一切以对象为中心. 一切皆为对象. 具体的某一个事务就是对象 2. 类. 对象 ...
    99+
    2023-01-30
    面向对象 python
  • python之成员(面向对象)
    1. 成员   在类中你能写的所有内容都是类的成员    class Person: def __init__(self, name, gender): self.name = name # 成员...
    99+
    2023-01-30
    面向对象 成员 python
  • python之路day06 面向对象
    面向对象(你就是上帝): 世间万物,皆可分类 世界万物,皆为对象 https://www.cnblogs.com/alex3714/articles/5188179.html 面向对象编程 OOP编程是利用“类”和“对象”来创建各种模型来...
    99+
    2023-01-30
    之路 面向对象 python
  • python面向对象之反射
    一、静态方法(staticmethod)和类方法(classmethod)类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属×××互(也就是可以使用类属性)静态方法:让类里的方法直接被类调用,就像正常调用函数一样类方法和静态方...
    99+
    2023-01-31
    反射 面向对象 python
  • Python面向对象之内置函数相关知识总结
    Python内置函数 1. classmethod、staticmethod、property 。 上述三个内置函数在文章(Python进阶——面向对象之成员)的方法和属性中已经详细...
    99+
    2024-04-02
  • python--初始面向对象:类的相关知识,对象的相关知识
    引子假设你是一个开发人员,现在需要你开发一款叫做当然很简单,两个角色,1个人物,1个boss,且人物和boss都有不同的技能,比如人物用觉醒技能秒了boss,掉了xx装备,boss用大招秒了人物,人物死亡,怎么描述这种不同的人物和他们的功能...
    99+
    2023-01-30
    相关知识 面向对象 对象
  • php面向对象教程3
    5.如何实例化对象我们上面说过面向对象程序的单位就是对象,但对象又是通过类的实例化出来的,既然我们类会声明了,下一步就是实例化对象了。当定义好类后,我们使用new 关键字来生成一个对象。$对象名称= new 类名称();<phpcla...
    99+
    2023-01-31
    面向对象 教程 php
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作