阅读本文大概需要 5 分钟。
对象,通常有两层意思,指行动或思考时作为目标的事物或特指恋爱的对方。在编程的世界里,对象就是客观世界中存在的人、事、物体等实体在计算机逻辑中的映射。
编程时,你可以将对象映射成任何你想映射的东西,只不过,映射的如果更符常规时,代码更容易使用和理解,也更有利于后续的快速迭代和扩展。在 Python 的世界里,万物皆对象。
概念之类的东西总是难以记忆,但却有助于我们理解,面向对象编程中常见的概念如下:
虽然举的例子不太恰当,但希望能加深你的理解,你可以深度将自己的对类的理解写下来,看看能否真正的理解它,其实更为确切的定义如下:
类是一群有着相同属性和函数的对象的集合。
我觉得提出一个好问题远比给出十种答案更能激发你去深入思考,下面我总结一下自己在学习 Python 面向对象时遇到的一些问题,这些问题,如果你觉得这些问题对你有用,可以加我个人微信相互交流。
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),来保证一个类只会被初始化一次。此解释来源于前文推荐的课程极额时间,个人看到后非常受用,特分享一下。
(完)
专注于有价值的技术分享
欢迎订阅、在看、转发