怎么理解面向对象?

2022-12-26 0 522

暂不认知说实话,流程词汇是一类程式设计价值观,当你认知后,你将在程式设计自学中迈进十分大一步棋。

认知流程词汇,具体来说认知要它的此基础基本概念:

流程词汇 ( Object Oriented ) 是将现实生活难题构筑亲密关系,接著抽象化为 类 ( class ),给类表述特性和方式后,再将类示例化为 示例 ( instance ) ,透过出访示例的特性和初始化方式来展开采用。

在相同的词汇中,第一类的表述覆盖范围相同。在 Python 中“类”和“类的示例”都称作 第一类 ( Object ),即使 Python 的类是更世界顶级的 type 示例化时的第一类,也是常说的“Python 里天地万物皆第一类”;而在 Java 等动态词汇中,通常把类的示例称作第一类。

认知了专业知识后,接著透过范例,再认知流程词汇的五大特点:PCB、承继、隐式。

上边他们把“伏羲造人”那个神话传说,用 Python 的流程词汇标识符来描述两遍:

假定他们是伏羲(流程斯特默),他们忽然有位设想,想造一大群和他们相差无几的无赖,无赖须要有男女生三种异性恋,外形和犯罪行为也有许多差别。那具体来说他们预测出,无论甚么异性恋,都如果有躯干,因此他们先仿效他们的内部结构,在脑子里构想Vaubecourt的模样(抽象化为),接著先突显Vaubecourt许多共计的犯罪行为(表述类的示例方式):

class Human(object): def __init__(self, name): # 有位英文名字,有三只手,双脚 self._name = name self.hands = 2 self.legs = 2 def introduce_self(self): # 介绍他们 print(我是%s % self._name) def work(self): # 工作,但还没有表述具体的犯罪行为 raise NotImplementedError

接著他们先捏3个Vaubecourt(示例化第一类),并给他们取了相同的英文名字(初始化示例特性):

>>> a = Human(大强子) >>> b = Human(二狗子) >>> c = Human(三愣子)

他们让其中一个人介绍他们(初始化示例方式):

>>> a.introduce_self() 我是大强子

这里解释一下 Human 的标识符,虽然设定了每个人都要工作,但如何工作须要到具体到相同类型的人,因此在派生类里他们并没有表述 work 方式的内容,如果强行初始化会抛出异常。

还有一点,上面表述特性时,他们把 self._name 前边加了下划线,是即使 Python 里用下划线来约定这是一个受保护变量(对应 Java 中的 protected ),他们不希望外界能直接出访 name 那个特性,必须要透过第一类初始化 introduce_self() 那个犯罪行为介绍了他们,别人才能知道他叫甚么英文名字,那个过程就称之为PCB

接著他们继续完成设想,须要给Vaubecourt增加三种异性恋,并且异性之间能结婚,他们开始在刚才Vaubecourt模型的此基础上(承继于派生类),构想出三种异性恋的Vaubecourt的区别(设置相同的特性),接著让他们都可以工作,但工作的内容不一样(初始化相同的方式出现相同结果,是隐式性),并决定让男人可以娶女人(将那个犯罪行为表述为男人的方式)。

import random class Female(Human): def __init__(self, name): # 初始化父类的初始化方式,依然有英文名字、三只手、双脚 super().__init__(name) # 头发和力量展开随机取值 self.hair = random.randint(3, 5) self.power = random.randint(1, 3) # 是否已婚 self.married = False def work(): print(%s采摘了许多果子 % self.name) class Male(Human): def __init__(self, name): super().__init__(name) self.hair = random.randint(0, 2) self.power = random.randint(2, 5) self.married = False def work(): print(%s出去打猎了一天 % self.name) def marry(self, other): # 判断他们或对方是否已结婚,否则抛出异常 if self.married is True or other.married is True: raise ValueError(法律不支持多次结婚) # 判断对方是否是女性,否则抛出异常 if isinstance(other, Female): self.married = True other.married = True else: raise TypeError(法律不支持同性结婚)

接著他们就可以让无赖活动起来:

>>> a = Male(大强子) >>> b = Male(二狗子) >>> c = Female(翠花) >>> for h in [a, b, c]: # 初始化父类的方式 h.introduce_self() 我是大强子 我是二狗子 我是翠花 >>> for h in [a, b, c]: # 隐式性使相同的方式产生相同的结果 h.work() 大强子出去打猎了一天 二狗子出去打猎了一天 翠花采摘了许多果子 >>> a.marry(c) >>> a.married True >>> c.married True >>> b.marry(c) ValueError: 法律不支持多次结婚 >>> b.marry(a) TypeError: 法律不支持同性结婚

设计到此结束,他们来复盘一下整个过程。

他们先是把人的共计特点抽象化为 Human 派生类,那个派生类并不用于示例化,而是用于让 Female 和 Male 承继它,并实现相同的犯罪行为。这样他们就避免把一些共计的犯罪行为重复在多个类里表述,如果他们后续想对人类的犯罪行为展开变动,也只须要修改 Human,承继 Human 的子类会自动获得新犯罪行为,这是 承继带来的好处。

他们把 name 设计为受保护变量,外界无法直接出访那个特性,让每个人的隐私得到了保障(许多不必要的犯罪行为变得可控),这是 PCB 带来的好处。

同时他们在 Human 中预留了 work 方式,并在 Female 和 Male 都实现了相同的效果,接著他们知道人人都有 work 方式,因此可以像 introduce_self 一样,用循环批量初始化 work 方式,这是 隐式 带来的好处。

看到这里你如果有些认知:流程词汇是将客观事物和许多亲密关系,抽象化为具体的模型(类),并为其设计特性和方式,即 第一类 = 特性(特点)+ 方式(犯罪行为)。

如果是拥有复杂亲密关系的需求,他们就如果尽可能将互相有关联的犯罪行为抽象化为类,比如每一个网页,网页中每一个组件 等等。实际上流程词汇帮助他们在几万行标识符的大型项目中,仍然可以游刃有余,正即使如此,才能发展为目前应用最为广泛的程式设计价值观

但也并不是说任何时候都要“流程词汇”,过度的PCB和抽象化,也会造成标识符可读性的下降,以及运行效率的下降,因此他们如果在能将事物抽象化化的需求中采用流程词汇。

最后,无论是面向甚么程式设计,终究还是要面向人生

欢迎关注微信公众号:面向人生程式设计,本号长期分享经验向文章

频及标识符

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务