编程是 程序 员 用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程 , 一个程序是程序员为了获得一个任务结果而编写的一组指令的集合,正所谓条条大路通罗马,实现一个任务的方式有不少种不一样的方式, 对这些不一样的编程方式的特色进行概括总结得出来的编程方式类别,即为编程范式。 不一样的编程范式本质上表明对各类类型的任务采起的不一样的解决问题的思路, 大多数语言只支持一种编程范式,固然也有些语言能够同时支持多种编程范式。 两种最重要的编程范式分别是面向过程编程和面向对象编程。html
面向过程编程(Procedural Programming)
Procedural programming uses a list of instructions to tell the computer what to do step-by-step.
面向过程编程依赖 - 你猜到了- procedures,一个procedure包含一组要被进行计算的步骤, 面向过程又被称为top-down languages, 就是程序从上到下一步步执行,一步步从上到下,从头至尾的解决问题 。基本设计思路就是程序一开始是要着手解决一个大的问题,而后把一个大问题分解成不少个小问题或子过程,这些子过程再执行的过程再继续分解直到小问题足够简单到能够在一个小步骤范围内解决。python
这样作的问题也是显而易见的,就是若是你要对程序进行修改,对你修改的那部分有依赖的各个部分你都也要跟着修改, 举个例子,若是程序开头你设置了一个变量值 为1 , 但若是其它子过程依赖这个值 为1的变量才能正常运行,那若是你改了这个变量,那这个子过程你也要修改,假如又有一个其它子程序依赖这个子过程 , 那就会发生一连串的影响,随着程序愈来愈大, 这种编程方式的维护难度会愈来愈高。
因此咱们通常认为, 若是你只是写一些简单的脚本,去作一些一次性任务,用面向过程的方式是极好的,但若是你要处理的任务是复杂的,且须要不断迭代和维护 的, 那仍是用面向对象最方便了。程序员
OOP编程是利用“类”和“对象”来建立各类模型来实现对真实世界的描述,使用面向对象编程的缘由一方面是由于它可使程序的维护和扩展变得更简单,而且能够大大提升程序开发效率 ,另外,基于面向对象的程序可使它人更加容易理解你的代码逻辑,从而使团队开发变得更从容。算法
面向对象的几个核心特性以下编程
Class 类
一个类便是对一类拥有相同属性的对象的抽象、蓝图、原型。在类中定义了这些对象的都具有的属性(variables(data))、共同的方法数据结构
Object 对象
一个对象便是一个类的实例化后实例,一个类必须通过实例化后方可在程序中调用,一个类能够实例化多个对象,每一个对象亦能够有不一样的属性,就像人类是指全部人,每一个人是指具体的对象,人与人以前有共性,亦有不一样编程语言
Encapsulation 封装
在类中对数据的赋值、内部调用对外部用户是透明的,这使类变成了一个胶囊或容器,里面包含着类的数据和方法模块化
Inheritance 继承
一个类能够派生出子类,在这个父类里定义的属性、方法自动被子类继承函数式编程
Polymorphism 多态
态是面向对象的重要特性,简单点说:“一个接口,多种实现”,指一个基类中派生出了不一样的子类,且每一个子类在继承了一样的方法名的同时又对父类的方法作了不一样的实现,这就是同一种事物表现出的多种形态。
编程其实就是一个将具体世界进行抽象化的过程,多态就是抽象化的一种体现,把一系列具体事物的共同点抽象出来, 再经过这个抽象的事物, 与不一样的具体事物进行对话。
对不一样类的对象发出相同的消息将会有不一样的行为。好比,你的老板让全部员工在九点钟开始工做, 他只要在九点钟的时候说:“开始工做”便可,而不须要对销售人员说:“开始销售工做”,对技术人员说:“开始技术工做”, 由于“员工”是一个抽象的事物, 只要是员工就能够开始工做,他知道这一点就好了。至于每一个员工,固然会各司其职,作各自的工做。
多态容许将子类的对象看成父类的对象使用,某父类型的引用指向其子类型的对象,调用的方法是该子类型的方法。这里引用和调用方法的代码编译前就已经决定了,而引用所指向的对象能够在运行期间动态绑定函数
1
2
3
4
5
6
7
8
9
10
11
|
#role 1
name
=
'Alex'
role
=
'terrorist'
weapon
=
'AK47'
life_value
=
100
#rolw 2
name2
=
'Jack'
role2
=
'police'
weapon2
=
'B22'
life_value2
=
100
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
#role 1
name
=
'Alex'
role
=
'terrorist'
weapon
=
'AK47'
life_value
=
100
money
=
10000
#rolw 2
name2
=
'Jack'
role2
=
'police'
weapon2
=
'B22'
life_value2
=
100
money2
=
10000
#role 3
name3
=
'Rain'
role3
=
'terrorist'
weapon3
=
'C33'
life_value3
=
100
money3
=
10000
#rolw 4
name4
=
'Eric'
role4
=
'police'
weapon4
=
'B51'
life_value4
=
100
money4
=
10000
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
roles
=
{
1
:{
'name'
:
'Alex'
,
'role'
:
'terrorist'
,
'weapon'
:
'AK47'
,
'life_value'
:
100
,
'money'
:
15000
,
},
2
:{
'name'
:
'Jack'
,
'role'
:
'police'
,
'weapon'
:
'B22'
,
'life_value'
:
100
,
'money'
:
15000
,
},
3
:{
'name'
:
'Rain'
,
'role'
:
'terrorist'
,
'weapon'
:
'C33'
,
'life_value'
:
100
,
'money'
:
15000
,
},
4
:{
'name'
:
'Eirc'
,
'role'
:
'police'
,
'weapon'
:
'B51'
,
'life_value'
:
100
,
'money'
:
15000
,
},
}
print
(roles[
1
])
#Alex
print
(roles[
2
])
#Jack
|
1
2
3
4
5
6
7
8
9
10
11
|
def
shot(by_who):
#开了枪后要减子弹数
pass
def
got_shot(who):
#中枪后要减血
who[‘life_value’]
-
=
10
pass
def
buy_gun(who,gun_name):
#检查钱够不够,买了枪后要扣钱
pass
...
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
class
Role(
object
):
def
__init__(
self
,name,role,weapon,life_value
=
100
,money
=
15000
):
self
.name
=
name
self
.role
=
role
self
.weapon
=
weapon
self
.life_value
=
life_value
self
.money
=
money
def
shot(
self
):
print
(
"shooting..."
)
def
got_shot(
self
):
print
(
"ah...,I got shot..."
)
def
buy_gun(
self
,gun_name):
print
(
"just bought %s"
%
gun_name)
r1
=
Role(
'Alex'
,
'police'
,'AK47’)
#生成一个角色
r2
=
Role(
'Jack'
,
'terrorist'
,'B22’)
#生成一个角色
|
1
2
3
4
5
6
7
|
class
Role(
object
):
#定义一个类, class是定义类的语法,Role是类名,(object)是新式类的写法,必须这样写,之后再讲为何
def
__init__(
self
,name,role,weapon,life_value
=
100
,money
=
15000
):
#初始化函数,在生成一个角色时要初始化的一些属性就填写在这里
self
.name
=
name
#__init__中的第一个参数self,和这里的self都 是什么意思? 看下面解释
self
.role
=
role
self
.weapon
=
weapon
self
.life_value
=
life_value
self
.money
=
money
|
1
2
|
r1
=
Role(
'Alex'
,
'police'
,'AK47’)
#生成一个角色 , 会自动把参数传给Role下面的__init__(...)方法
r2
=
Role(
'Jack'
,
'terrorist'
,'B22’)
#生成一个角色
|
咱们看到,上面的建立角色时,咱们并无给__init__传值,程序也没未报错,是由于,类在调用它本身的__init__(…)时本身帮你给self参数赋值了,
1
2
|
r1
=
Role(
'Alex'
,
'police'
,
'AK47’) #此时self 至关于 r1 , Role(r1,'
Alex
','
police
','
AK47’)
r2
=
Role(
'Jack'
,
'terrorist'
,
'B22’)#此时self 至关于 r2, Role(r2,'
Jack
','
terrorist
','
B22’)
|
1
2
|
def
buy_gun(
self
,gun_name):
print
(“
%
s has just bought
%
s”
%
(
self
.name,gun_name) )
|
1
2
|
r1
=
Role(
'Alex'
,
'police'
,
'AK47'
)
r1.buy_gun(
"B21”) #python 会自动帮你转成 Role.buy_gun(r1,”B21"
)
|
封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。
封装,也就是把客观事物封装成抽象的类,而且类能够把本身的数据和方法只让可信的类或者对象操做,对不可信的进行信息隐藏。
面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可使用现有类的全部功能,并在无需从新编写原来的类的状况下对这些功能进行扩展。
经过继承建立的新类称为“子类”或“派生类”。
被继承的类称为“基类”、“父类”或“超类”。
继承的过程,就是从通常到特殊的过程。
要实现继承,能够经过“继承”(Inheritance)和“组合”(Composition)来实现。
在某些 OOP 语言中,一个子类能够继承多个基类。可是通常状况下,一个子类只能有一个基类,要实现多重继承,能够经过多级继承来实现。
继承概念的实现方式有三类:实现继承、接口继承和可视继承。
在考虑使用继承时,有一点须要注意,那就是两个类之间的关系应该是“属于”关系。例如,Employee 是一我的,Manager 也是一我的,所以这两个类均可以继承 Person 类。可是 Leg 类却不能继承 Person 类,由于腿并非一我的。
OO开发范式大体为:划分对象→抽象类→将类组织成为层次化结构(继承和合成) →用类与实例进行设计和实现几个阶段。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
class
Animal:
def
__init__(
self
, name):
# Constructor of the class
self
.name
=
name
def
talk(
self
):
# Abstract method, defined by convention only
raise
NotImplementedError(
"Subclass must implement abstract method"
)
class
Cat(Animal):
def
talk(
self
):
return
'Meow!'
class
Dog(Animal):
def
talk(
self
):
return
'Woof! Woof!'
animals
=
[Cat(
'Missy'
),
Dog(
'Lassie'
)]
for
animal
in
animals:
print
animal.name
+
': '
+
animal.talk()
|