深入理解一下 Python 中的面向对象编程

简介: 今天,我们就来走进面向对象编程的理想国(一)——深入理解一下 Python 中的面向对象编程(Object-Oriented Programming, OOP)。

程序设计之面向对象编程

image.png

1. 为什么需要程序设计?

在建筑行业,建筑师一般不会想要为一幢 100 层的大楼添加一个地下室,因为这样做无疑是成本过高,甚至有可能会失败。(上半年刚监考过一级建筑师考试,3.5 小时的场地设计画图题看着都难。)令人吃惊的是,在我们的软件开发行业中,当用户提出类似的改动时,都不会去多想。相反,老板或者产品经理可能会说这是一个简单的编程问题。(哈哈,这里无意中伤程序员与产品经理...)


但是,软件本质上是复杂的,随着项目的迭代,复杂性往往超出了人类智能的范围。

2. 是否存在“最好的”设计?

在每一种工程实践中,设计都是一种训练有素的方法。不管是函数式编程、泛型编程、并发编程、面向过程基于对象面向对象等的程序设计,我们通过设计方法来创造某个问题的解决方案,从而提供时间需求的途径。


那么,是否存在**“最好的”**设计方法?


这个问题可能没有绝对的答案,但《没有“银弹”》告诉我们:没有单纯的技术或管理上的进步可以万无一失地让软件工程从需求得到一个复杂系统的实现。所以,面向对象也不是解决软件开发中所有问题的最后的“银弹”,如今很多高级编程语言提供了多种编程设计范式,Python 也不例外。

3. 为什么面向对象编程?

类是面向对象程序编程的主要工具,我们用它来定义新种类的方式,它在程序领域中反映了现实中的对象。而什么是面向对象编程呢?


面向对象编程是一种实现的方法,在这种方法中,程序被组织成许多组相互协作的对象,每个对象代表某个类的一个实例,而类则属于一个通过继承关系形成的层次结构。


来看一下概念中的三个要点:


  1. 利用对象作为程序的基本单元,而不是算法
  2. 每一个对象都是某个类的一个实例
  3. 类和类之间可以通过继承关系联系在一起


满足这三点才是叫面向对象的程序。我们用一个简单的例子来模拟一下


接着,我们先了解一下面向对象的三个核心概念:


  1. 继承。通俗理解,“儿子从父亲那继承下来的东西”。如果在一个类的基础上创建新的有类,会将父类的属性和方法直接继承下来,从而减少重复代码的编写。提供继承信息(财产)的我们称为父类、或者基类、超类;得到继承信息的我们称为子类、或派生类或衍生类。
  2. 多态。字面意思,“多种形态”,接口的不同实现方式即为多态。通过多态,子类可以扩展父类的能力,或者覆写父类的操作。
  3. 封装。我对封装的理解,就像一个具有某些功能的黑箱子,隐藏一切可以隐藏的实现细节,然后对外提供简单的编程接口。


面向对象编程提供了一种有效的编程方式,利用这种方式,我们将代码冗余程度降到最低。因此,我们可以通过定制已有的代码来编写新的程序而不是在原处进行修改。

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 对象的三个特性

Python 的所有对象都有三个特性:身份(id)类型(type)值(value)


  • 身份(id):每个对象都有一个唯一的身份标识自己,任何对象的身份都可以使用内建函数 id() 来得到,可以简单的认为这个值是该对象的内存地址。
a = 3
b = a
id(a)
id(b)
id(test_list)


  • 类型(type):对象的类型决定了对象可以保存什么类型的值,有哪些属性和方法,可以进行哪些操作,遵循怎样的规则。可以使用内建函数 type() 来查看对象的类型。
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'>


  • 值(value):对象所表示的数据
print(a)  # 3
print(test_list)  # [1, 2, 3, 4, 5]
print(test_str)    # I love python


"身份"、"类型"和"值"在所有对象创建时被赋值。只要对象存在,这三个特性就一直存在。

总结

事实上,我们学习的软件框架(framework)就是父类的集合,框架就是把常见的程序设计任务实现成类,我们所需要做的就是通过编写自己的子类,组合和定制已调试过的代码。此外,将常见的 OOP 结构归类,就是我们的设计模式(design pattern),来协助解决设计中的问题。

相关文章
|
9月前
|
Python
Python编程作业五:面向对象编程
Python编程作业五:面向对象编程
85 1
|
9月前
|
Python
【Python进阶(三)】——面向对象编程
【Python进阶(三)】——面向对象编程
|
4月前
|
Java C# Python
Python学习七:面向对象编程(中)
这篇文章是关于Python面向对象编程的中级教程,涵盖了析构函数、对象的三大特征(封装、继承、多态)、类属性与实例属性、以及类方法与静态方法的对比。
45 2
|
4月前
|
设计模式 安全 JavaScript
Python学习八:面向对象编程(下):异常、私有等
这篇文章详细介绍了Python面向对象编程中的私有属性、私有方法、异常处理及动态添加属性和方法等关键概念。
40 1
|
5月前
|
存储 Java 程序员
30天拿下Python之面向对象编程
30天拿下Python之面向对象编程
27 3
|
5月前
|
Java Python
全网最适合入门的面向对象编程教程:50 Python函数方法与接口-接口和抽象基类
【9月更文挑战第18天】在 Python 中,虽无明确的 `interface` 关键字,但可通过约定实现类似功能。接口主要规定了需实现的方法,不提供具体实现。抽象基类(ABC)则通过 `@abstractmethod` 装饰器定义抽象方法,子类必须实现这些方法。使用抽象基类可使继承结构更清晰、规范,并确保子类遵循指定的方法实现。然而,其使用应根据实际需求决定,避免过度设计导致代码复杂。
|
5月前
|
Python
全网最适合入门的面向对象编程教程:Python函数方法与接口-函数与方法的区别和lamda匿名函数
【9月更文挑战第15天】在 Python 中,函数与方法有所区别:函数是独立的代码块,可通过函数名直接调用,不依赖特定类或对象;方法则是与类或对象关联的函数,通常在类内部定义并通过对象调用。Lambda 函数是一种简洁的匿名函数定义方式,常用于简单的操作或作为其他函数的参数。根据需求,可选择使用函数、方法或 lambda 函数来实现代码逻辑。
|
4月前
|
Java Python
Python学习六:面向对象编程(上)
这篇文章是关于Python面向对象编程的基础知识,包括类和对象的概念、实例方法、属性、self关键字以及魔法方法等。
28 0
|
6月前
|
Python
Python 中的面向对象编程 (OOP)
【8月更文挑战第29天】
53 7
|
6月前
|
机器学习/深度学习 PHP 开发者
探索PHP中的面向对象编程构建你的首个机器学习模型:以Python和scikit-learn为例
【8月更文挑战第30天】在PHP的世界中,面向对象编程(OOP)是一块基石,它让代码更加模块化、易于管理和维护。本文将深入探讨PHP中面向对象的魔法,从类和对象的定义开始,到继承、多态性、封装等核心概念,再到实战中如何应用这些理念来构建更健壮的应用。我们将通过示例代码,一起见证PHP中OOP的魔力,并理解其背后的设计哲学。

热门文章

最新文章