一,面向對象的特性
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,你打印輸出一下你自己吧】
從目前的例子里面,這樣改寫還沒有造成什么明顯的區別。但是有的時候,從函數轉為對象,能夠讓函數(或者方法)更加通用,也讓程序更容易維護,還便於代碼的重用。
結束。