這可能是更容易,如果你定義自己的類,實例,方法和功能明白了一切。
class Car(object):
def set_odometer(self, miles):
self.miles = miles
def get_odometer(self):
return self.miles
def drive(self, miles):
self.miles += miles
def joyride(stolen_car):
stolen_car.drive(100)
print 'Insert Yello song here'
new_car = Car()
new_car.set_odometer(0)
print 'Now it has', new_car.get_odometer(), 'miles!'
joyride(new_car)
print 'Now it has', new_car.get_odometer(), 'miles!'
所以:
Car
是一類。一個類定義了一個新類型。正如int
定義了整數,並且str
定義了字符串,Car
定義了一種新的東西,您可以drive
(並做其他事情)。
每次創建Car
類的新實例時,它都是一個對象。例如,new_car
是Car
的一個實例。也就是說,這是一件你可以drive
(並做其他事情)。
Car.drive
是Car
類的一種方法。這意味着new_car.drive
是new_car
實例的一種方法。請注意0定義中的self
參數。當您致電new_car.set_odometer(100)
時,self
參數指的是new_car
。
joyride
是一個函數。它不是任何課程的一部分,也沒有self
參數。這實際上是方法和功能之間的唯一區別。
(事實上,在幕後,在Python中,方法只是把一個函數和一個實例在一起的方式。例如,new_car.drive.im_self
是new_car
,不過不要擔心。)
請注意,在joyride
,stolen_car
之內是您傳入的同一對象,在這種情況下爲new_car
。所以,你可以打電話stolen_car.drive()
,它的驅動new_car
。
在實際的代碼,你通常不會像set_odometer
和get_odometer
方法麻煩,因爲你可以訪問數據的屬性,又名成員,如miles
一樣容易,你可以訪問方法:
new_car = Car()
new_car.miles = 0
print 'Now it has', new_car.miles, 'miles!'
然而,您通常會在特殊的__init__
方法中爲您的屬性設置初始值。例如:
class Car(object):
def __init__(self):
self.miles = 0
def drive(self, miles):
self.miles += miles
def joyride(stolen_car):
stolen_car.drive(100)
print 'Insert Yello song here'
new_car = Car()
print 'Now it has', new_car.get_odometer(), 'miles!'
joyride(new_car)
print 'Now it has', new_car.get_odometer(), 'miles!'
那麼,如何適用於你的榜樣?
那麼,你的例子有點混亂。你根本不會調用任何普通的實例方法。但是,讓我們一步一步地完成它。
from datetime import datetime
datetime
是一類。你怎麼知道?嗯,你可以看看datetime
模塊裏面的代碼,但是,更簡單地說,只是打印:
>>> from datetime import datetime
>>> print datetime
<type 'datetime.datetime'>
不嚴格地說,新type
和class
是相同的東西。 (A type
實際上可以編寫定製的C代碼,而不是用一個class
,等等,所以這是不完全正確,但它是足夠接近。)
now = datetime.now()
datetime.now
是一種特殊的東西稱爲classmethod
。普通方法只能在實例上調用,而類方法則是在類上調用。現在不要擔心這一點。重要的是它返回的是一個對象,類型爲datetime
的實例。同樣,你可以測試,通過打印出其type
:
>>> now = datetime.now()
>>> print type(d)
<type 'datetime.datetime'>
然後你只需訪問該對象的一些數據屬性:
month1 = now.month
year1 = now.year
day1 = now.day
這些屬性是由now
方法設置,大大的一個普通的類將其__init__
方法中的屬性相同的方式。
我真的認爲方法和函數是相同的東西,直到我讀到這個:http://stackoverflow.com/a/155655/16959(這應該回答你所有的三個問題) –
方法只是附加到一個類的功能。 'datetime'是一個類。 'now'變量是'datetime'類的一個實例 – cmd