天天跟我们这些苦逼的程序猿(媛)们喊着:“要面向对象编程”,你倒是给我新建一个对象嘛。你看看,都没有对象,我怎么面向对象编程嘛。网上关于Java和C++的面向对象编程相关介绍的博客文章已经很多了,那我为什么还写呢?因为,人生苦短,刚好我是学Python的...
今天,我们就来走进面向对象编程的理想国(一)——深入理解一下Python中的面向对象编程(Object-Oriented Programming, OOP)。
“日子一天一天过 我们会慢慢长大,我不管你懂不懂我在唱什么...时光匆匆匆匆流走,也也也不回头...”
怎么还唱起来歌了。是的,你肯定不知道我准备写什么,因为我也不知道。这个故事是这样的,当我听到小齐哥这首欢快的歌《浪花一朵朵》,就会不自觉的跟着哼唱,这歌也太好听了吧。
刚好今天当我在学习Python的OOP时,刚想吐槽这面向对象编程内容还挺多,突然就有一句乱入了——美女“编程”老太婆。???,这好不容易有个美女编程,怎么变成了老太婆。
以上纯属瞎编,话说回来,能有个“对象”面向对象编程,一起变成糟老头和老太婆也挺好的,你说对不对。
面向对象编程
在建筑行业,建筑师一般不会想要为一幢100层的大楼添加一个地下室,因为这样做无疑是成本过高,甚至有可能会失败。(上半年刚监考过一级建筑师考试,3.5小时的场地设计画图题看着都难。) 令人吃惊的是,在我们的软件开发行业中,当用户提出类似的改动时,都不会去多想。相反,老板或者产品经理可能会说这是一个简单的编程问题。(哈哈,这里无意中伤程序员与产品经理...)
但是,软件本质上是复杂的,随着项目的迭代,复杂性往往超出了人类智能的范围。
在每一种工程实践中,设计都是一种训练有素的方法。不管是函数式编程、泛型编程、并发编程、面向过程、基于对象、面向对象等的程序设计,我们通过设计方法来创造某个问题的解决方案,从而提供时间需求的途径。
那么,是否存在“最好的”设计方法?
这个问题可能没有绝对的答案,但《没有“银弹”》告诉我们:没有单纯的技术或管理上的进步可以万无一失地让软件工程从需求得到一个复杂系统的实现。所以,面向对象也不是解决软件开发中所有问题的最后的“银弹”,如今很多高级编程语言提供了多种编程设计范式,Python也不例外。
类是面向对象程序编程的主要工具,我们用它来定义新种类的方式,它在程序领域中反映了现实中的对象。而什么是面向对象编程呢?
面向对象编程是一种实现的方法,在这种方法中,程序被组织成许多组相互协作的对象,每个对象代表某个类的一个实例,而类则属于一个通过继承关系形成的层次结构。
来看一下概念中的三个要点:
满足这三点才是叫面向对象的程序。我们用一个简单的例子来模拟一下
接着,我们先了解一下面向对象的三个核心概念:
面向对象编程提供了一种有效的编程方式,利用这种方式,我们将代码冗余程度降到最低。因此,我们可以通过定制已有的代码来编写新的程序而不是在原处进行修改。
在Python中,OOP是完全不是必须的,在初学阶段也不需要使用类,利用函数结构也能写出很多好用的脚本,完成很多有趣的编程。但是Python OOP也非常有意思,不信你跟我一起学学。
Java虽然也是面向对象编程的语言,但是血统没有Python纯正。比如Java的八种基本数据类型之一int,在持久化的时候,就需要包装成Integer类对象。
与Java相比,Python的面向对象更彻底。学过Python的朋友可能知道,在Python中,把我们所有能看到的都变成对象——数字、字符串、元组、列表、字典、函数、方法、类、模块、包括你的代码。
怎么理解这个过程呢?Python 中的一切都可以赋值给变量或者作为参数传递给函数,我们来看一下代码:
a = 3
b = a
print(a) # 打印:3
print(b) # 打印:3
def all_is_object():
print("Learing Python OOP")
all_is_well = all_is_object
all_is_object() # 打印:Learing Python OOP
all_is_well() # 打印:Learing Python OOP
class Person():
def __init__(self, name):
print("姓名:", name)
A = Person
xiaoyu = A("小宇") # 姓名: 小宇
Python 的所有对象都有三个特性:身份(id)、类型(type)、值(value)
a = 3
b = a
id(a)
id(b)
id(test_list)
a = 3
b = a
print(type(a)) # <class 'int'>
print(type(int)) # <class 'type'>
test_list = [1, 2, 3, 4, 5]
print(type(test_list)) # <class 'list'>
print(type(list)) # <class 'type'>
test_tuple = (1, 2, 3, 4, 5)
print(type(test_tuple)) # <class 'tuple'>
print(type(tuple)) # <class 'type'>
test_str = "I love python"
print(type(test_str)) # <class 'str'>
print(type(str)) # <class 'type'>
print(a) # 3
print(test_list) # [1, 2, 3, 4, 5]
print(test_str) # I love python
"身份"、"类型"和"值"在所有对象创建时被赋值。只要对象存在,这三个特性就一直存在。
事实上,我们学习的软件框架(framework)就是父类的集合,框架就是把常见的程序设计任务实现成类,我们所需要做的就是通过编写自己的子类,组合和定制已调试过的代码。此外,将常见的OOP结构归类,就是我们的设计模式(design pattern),来协助解决设计中的问题。
这些软件框架可能提供一些数据库接口、测试协议、GUI工具包等
本章对类和面向对象编程进行了一些概念性的介绍,让我们大致一览OOP理想国的风景。
系列文章参考书籍: