Python类和方法_特性与输出对象

一,面向对象的特性

Python 是一种面向对象的编程语言,这就意味着它提供了一些支持面向对象编程的功能,有以下这些特点:

• 程序包含类和方法的定义。

• 大多数运算都以对象运算的形式来实现。

• 对象往往代表着现实世界中的事物,方法则相对应地代表着现实世界中事物之间的相互作用。

比如之前定义的 Time 类就代表了人们生活中计算一天时间的方法,那些函数就对应着人们对时间的处理需求。Point 和 Rectangle 类就对应着现实中的数学概念上的点和矩形。

目前,我们还没有用到 Python 提供的用于面向对象编程的高级功能。虽然这些高级功能并不是严格意义上必须使用的,但它们大多是提供了一些我们已经实现的功能的一种备选的语法形式。

不过在很多情况下,这种备选的模式更加简洁,也能更加准确地表述程序的结构。

例如,在 Time1.py 里面,类的定义和后面的函数定义就没有明显的联系。测试一下就会发现,每一个后续的函数里面都至少用了一个 Time 对象作为参数。

通过分析这些过程,我们可以使用一种特殊的函数,即方法;它是某一特定的类所附带的函数。比如字符串、列表、字典以及元组的一些方法。

其实,方法在语义上与函数是完全相同的,但在语法上有两点不同:

1.方法要定义在一个类定义的内部,这样能保证方法和类之间的关系明确。

2.调用一个方法的语法与调用函数的语法是不一样的。

二,输出对象

1.之前我们定义过一个名为Time 的类,当时写过名为 print_time 的函数:

>>> class Time:

...       """Represents the time of day."""

... 

>>> def print_time(time):

...     print('%.2d:%.2d:%.2d' % (time.hour, time.minute, time.second))

... 

要调用这个函数print_time,就必须给传递过去一个Time 对象作为参数:

>>> start = Time()

>>> start.hour = 9

>>> start.minute = 45

>>> start.second = 00

>>> print_time(start)

09:45:00

2.如果要让 print_time 成为一个方法,只需要把函数定义内容放到类定义里面去。

>>> class Time:

...       def print_time(time):

...           print('%.2d:%.2d:%.2d' % (time.hour, time.minute, time.second))

...

现在就有两种方法来调用 print_time 这个函数了:

第1种,用函数的语法:

>>> Time.print_time(start)

09:45:00

上面这里用到了点号,Time 是类的名字,print_time 是方法的名字,start 就是传过去的一个参数了。

第2种,用方法的语法:

>>> start.print_time()

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

AttributeError: 'Time' object has no attribute 'print_time'

这里报错对象没有属性,必须再次传递Time 对象作为参数:

>>> start = Time()

>>> start.hour = 9

>>> start.minute = 45

>>> start.second = 00

>>> start.print_time()

09:45:00

这里也用了点号,print_time 依然还是方法名字,然后 start 是调用方法所在的对象,也叫做主语。这里就如同句子中的主语一样,方法调用的主语就是方法的归属者。

在方法内部,主语被用作第一个参数,所以在上面的例子中,start 就被赋值给了参数time。

3.按照惯例,方法的第一个参数也叫做 self,所以刚刚的 print_time 函数可以按照如下这种更为通用的形式来写:

>>> class Time:

...     def print_time(self):

...         print('%.2d:%.2d:%.2d' % (self.hour, self.minute, self.second))

... 

这种改写的更深层次意义:

函数调用的语法里面,print_time(start)表明了函数是主动的。就相当于说【嘿,print_time 函数!,给你一个对象叫start,你来打印输出一下。】

* 而在面向对象的编程中,对象是主动的。方法的调用,比如 start.print_time(),就像是说【嘿,start,你打印输出一下你自己吧】

从目前的例子里面,这样改写还没有造成什么明显的区别。但是有的时候,从函数转为对象,能够让函数(或者方法)更加通用,也让程序更容易维护,还便于代码的重用。

结束。

原文地址:https://www.cnblogs.com/liusingbon/p/13299864.html