美文网首页数字生活新工具新观念
Python面向对象的几个问题

Python面向对象的几个问题

作者: somenzz | 来源:发表于2019-06-05 23:43 被阅读31次

对象,通常有两层意思,指行动或思考时作为目标的事物或特指恋爱的对方。在编程的世界里,对象就是客观世界中存在的人、事、物体等实体在计算机逻辑中的映射。

编程时,你可以将对象映射成任何你想映射的东西,只不过,映射的如果更符常规时,代码更容易使用和理解,也更有利于后续的快速迭代和扩展。在 Python 的世界里,万物皆对象。

概念之类的东西总是难以记忆,但却有助于我们理解,面向对象编程中常见的概念如下:

  • 类:类就是分类的类,代表着一群有着相似性的事物的集合,对应 Python 关键字 class。

  • 对象:集合中一个具体的事物,是由类生成的,也叫 object,或者实体,比如女人是一个类,而你的女朋友就是一个对象。

  • 属性:对象的某个静态特征,比如你女朋友的肤色,民族,血型等。

  • 函数:对象的某个动态能力,比如你女朋友会唱歌、弹琴等。

虽然举的例子不太恰当,但希望能加深你的理解,你可以深度将自己的对类的理解写下来,看看能否真正的理解它,其实更为确切的定义如下:

类是一群有着相同属性和函数的对象的集合。

我觉得提出一个好问题远比给出十种答案更能激发你去深入思考,下面我总结一下自己在学习 Python 面向对象时遇到的一些问题,这些问题,如果你觉得这些问题对你有用,可以加我个人微信相互交流(微信号 somenzz)。

1、即然有了函数,为什么还要有类?

2、Python 如何定义 公有/保护/私有 属性/方法? 私有是、否是真正的私有,这样做的目的是什么?

3、如何定义类函数、成员函数、静态函数,他们的作用分别是什么?

4、类可以被继承,如何让子类必须重写父类的函数才能使用,否则抛出异常?

5、类可以被继承,构造函数的执行顺序是先子类再父类再爷类,假如多重继承时,比如 B 和 C 都继承 A,D 继承 B 和 C,那么 D 在初始化的时候,A,B,C 的初始化顺序是怎么样的? A 是否会初始化两次?

 --->B---
A-          -->D
 --->C---

前 4 个问题从网上可以轻易找到答案,这里给出问题 5 的两种验证代码:

第一种:

class A:
    def __init__(self):
        print("A is called")

class B(A):
    def __init__(self):
        print("B is called")
        A.__init__(self)

class C(A):
    def __init__(self):
        print("C is called")
        A.__init__(self)

class D(B,C):
    def __init__(self):
        print("D is called")
        B.__init__(self)
        C.__init__(self)

d = D()
# 输出
# D is called
# B is called
# A is called
# C is called
# A is called

第二种

class A:
    def __init__(self):
        print("enter A")
        print("levave A")

class B(A):
    def __init__(self):
        print("enter B")
        super().__init__()
        print("levave B")

class C(A):
    def __init__(self):
        print("enter C")
        super().__init__()
        print("levave C")

class D(B,C):
    def __init__(self):
        print("enter D")
        super().__init__()
        print("levave D")

d = D()
# 输出
# enter D
# enter B
# enter C
# enter A
# levave A
# levave C
# levave B
# levave D

第一种方法非常明确的表明了菱形继承潜在的问题:一个基类的初始化函数可能被调用两次。在一般的工程中,这显然不是我们所希望的。正确的做法应该是使用 super 来召唤父类的构造函数,而且 python 使用一种叫做方法解析顺序的算法(具体实现算法叫做 C3),来保证一个类只会被初始化一次(来源于前文推荐的课程极额时间)。

相关文章

  • python面向对象学习笔记-01

    学习笔记 # 0,OOP-Python面向对象 - Python的面向对象 - 面向对象编程 - 基础 -...

  • Python面向对象的几个问题

    对象,通常有两层意思,指行动或思考时作为目标的事物或特指恋爱的对方。在编程的世界里,对象就是客观世界中存在的人、事...

  • Python 面向对象编程

    Python 面向对象编程(一) Python 面向对象编程(一) 虽然Python是解释性语言,但是它是面向对象...

  • python基础-02

    Python 面向对象 python是一门面向对象的语言 Python内置类属性 python对象销毁(垃圾回收)...

  • 王艳华Pythonday03

    Python的面向对象 Java 面向对象 继承

  • Python OOP-1

    0. OOP-Python面向对象 Python面向对象 面向对象编程基础公有私有继承组合,Mixin 魔法函数魔...

  • Python进阶1

    Python中一切皆对象 引言 Java语言也是面向对象的语言,但是Python要更加彻底 Python的面向对象...

  • 2019-10-23

    python面向对象编程总结 python中的对象:在其...

  • 营销比赛二三事

    Python面向对象编程三大特性调研 Python面向对象之封装 在Python中,没有类似 private 之类...

  • Python精简入门学习(十四)

    Python精简入门学习之面向对象(oop) -面向对象 -类和对象

网友评论

    本文标题:Python面向对象的几个问题

    本文链接:https://www.haomeiwen.com/subject/edadxctx.html