如果您定义自己的类、实例、方法和函数,可能会更容易理解所有内容。
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
实例的一个方法。注意self
定义中的参数drive
。当您调用时new_car.set_odometer(100)
,该self
参数指的是new_car
.
joyride
是一个函数。它不属于任何类,也没有self
参数。这实际上是方法和函数之间的唯一区别。
(实际上,在 Python 中,方法只是将函数和实例放在一起的一种方式。例如,new_car.drive.im_self
is new_car
。但不要担心。)
请注意,内部joyride
,stolen_car
是您传入的同一个对象——在本例中,new_car
。所以,你可以打电话stolen_car.drive()
,它正在开车new_car
。
在实际代码中,您通常不会使用 and 之类的方法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'>
粗略地说,atype
和 aclass
是一回事。( Atype
实际上可以用自定义 C 代码编写,而不是用 aclass
等等,所以这并不完全正确,但它已经足够接近了。)
now = datetime.now()
datetime.now
是一种特殊的东西,称为 a classmethod
。普通方法只能在实例上调用,而类方法则在类上调用。暂时不用担心这个。重要的是它返回的是一个对象,一个 type 的实例datetime
。同样,您可以通过打印出它来测试它type
:
>>> now = datetime.now()
>>> print type(d)
<type 'datetime.datetime'>
然后您只需访问对象的一些数据属性:
month1 = now.month
year1 = now.year
day1 = now.day
这些属性由now
方法设置,与普通类在其__init__
方法中设置属性的方式非常相似。