python面向对象的基本概念

Python基础09 面向对象的基本概念

  Python是一种面向对象的编程语言,这意味着它提供了支持面向对象编程(OOP)的功能。

1、面向对象的基本概念

  面向对象的编程起源于1960年代,但是直到1980年代中期它才成为创建新软件时使用的主要编程范例。它被开发为处理快速增长的大规模和复杂性软件系统,并使随着时间的推移更容易修改这些大型而复杂的系统的方法。

Python基础09 面向对象的基本概念

  在过程编程中,重点是编写对数据进行操作的函数或过程。在面向对象的编程中,重点是创建同时包含数据和功能的对象。

  通常,每个对象定义对应于现实世界中的某个对象或概念,并且在该对象上运行的功能对应于现实世界中的对象交互的方式。

2、用户定义的复合数据类型

  我们已经看过诸如str,int,float和Turtle之类的类。现在,我们准备创建我们自己的用户定义的类:Point。

  考虑数学点的概念。在二维中,一个点是两个数字(坐标),它们被一起视为一个对象。点通常用括号括起来,并用逗号分隔坐标。例如,(0,0)代表原点,而(x,y)代表点x向右的单位和y距离原点的y单位。

  与点关联的一些典型操作可能是计算一个点到原点或到另一个点的距离,或者找到两个点的中点,或者询问一个点是否落在给定的矩形或圆形内。我们很快将看到如何将它们与数据一起组织。

  在Python中表示点的自然方法是使用两个数值。那么,问题是如何将这两个值组合成一个复合对象。快速而肮脏的解决方案是使用元组,对于某些应用程序可能是个不错的选择。

  另一种方法是定义一个新类。这种方法需要更多的努力,但是它的优点很快就会显现出来。我们希望每个点都具有x和y属性,因此我们的第一个类定义如下所示:

class Point:
    """ Point class represents and manipulates x,y coords. """

    def __init__(self):
        """ Create a new point at the origin """
        self.x = 0
        self.y = 0

  类定义可以出现在程序中的任何位置,但是它们通常在开头附近(在import语句之后)。一些程序员和语言更喜欢将每个类放在自己的模块中-我们在这里不会这样做。类定义的语法规则与其他复合语句的语法规则相同。有一个标题,该标题以关键字class开头,后跟该类的名称,并以冒号结尾。缩进级别告诉我们课程在哪里结束。

  如果类标题之后的第一行是字符串,则它将成为该类的文档字符串,并会被各种工具识别。(这也是文档字符串在函数中的工作方式。更多函数可参考官网

  每个类都应具有一个特殊名称_init_的方法。每当创建Point的新实例时,都会自动调用此初始化方法。通过为程序员提供其初始状态/值,它使程序员有机会在新实例中设置所需的属性。该 self(我们可以选择任何其他的名字,但self是惯例)被自动设置为引用新创建的对象需要被初始化。

  现在让我们使用新的Point类:

p = Point()         # 实例化Point类型
q = Point()         # 创建第二个实例化类

print(p.x, p.y, q.x, q.y)   # 每个点对象具有它自己的x和y

该程序打印:

0  0  0  0

  因为在对象初始化期间,我们为每个对象创建了两个名为x和y的属性,并将它们的值都设置为0。

  这看起来很熟悉-我们之前使用过类来创建多个对象:

from turtle import Turtle

tess = Turtle()     # 实例化Turtle类型的对象
alex = Turtle()

  变量p和q被分配了对两个新Point对象的引用。诸如Turtle或Point之类的函数会创建一个新的对象实例,该函数称为构造函数,每个类都会自动提供一个构造函数,该函数的名称与该类相同。可参考Python基础08 函数

  将类视为制造对象的工厂可能会有所帮助。该类本身不是点的实例,但是它包含制作点实例的机制。每次我们调用构造函数时,我们都要求工厂为我们提供一个新对象。当对象离开生产线时,将执行其初始化方法以使用其出厂默认设置正确设置对象。

  “使我成为新对象”和“将其设置初始化为出厂默认设置”的组合过程称为实例化。

3、属性

  像现实世界中的对象一样,对象实例同时具有属性和方法。

  我们可以使用点符号来修改实例中的属性:

>>> p.x = 3
>>> p.y = 4

  模块和实例都创建自己的名称空间,并且访问每个名称空间中包含的名称的语法(称为attribute)是相同的。在这种情况下,我们选择的属性是实例中的数据项。

  以下状态图显示了这些分配的结果:

Python基础09 面向对象的基本概念

  变量p指向一个Point对象,该对象包含两个属性。每个属性都引用一个数字。

  我们可以使用相同的语法访问属性的值:

>>> print(p.y)
4
>>> x = p.x
>>> print(x)
3

  表达式p.x的意思是,“转到对象p引用并获取x的值”。在这种情况下,我们将该值分配给名为x的变量。变量x(在此处的全局名称空间中)与属性x(在属于该实例的名称空间中)之间没有冲突。点表示法的目的是完全限定我们明确指的是哪个变量。

  我们可以将点符号用作任何表达式的一部分,因此以下语句是合法的:

print("(x={0}, y={1})".format(p.x, p.y))
distance_squared_from_origin = p.x * p.x + p.y * p.y

  第一行输出(x=3,y=4)。第二行计算值25。

  推荐:零基础如何开始学习Python


Leave a Comment

Your email address will not be published. Required fields are marked *


Scroll to Top