<p>如果您定义自己的类、实例、方法和函数,那么您可能更容易理解所有内容。在</p>
<pre><code>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!'
</code></pre>
<p>所以:</p>
<p><code>Car</code>是一个类。类定义一个新类型。就像<code>int</code>定义整数,<code>str</code>定义字符串一样,<code>Car</code>定义了一种新的东西,你可以<code>drive</code>(并对其执行其他操作)。在</p>
<p>每次创建<code>Car</code>类的新实例时,它都是一个对象。例如,<code>new_car</code>是<code>Car</code>的实例。也就是说,这是一个你可以<code>drive</code>(以及做其他事情)的事情。在</p>
<p><code>Car.drive</code>是<code>Car</code>类的一个方法。这意味着<code>new_car.drive</code>是<code>new_car</code>实例的一个方法。注意<code>drive</code>定义中的<code>self</code>参数。当您调用<code>new_car.set_odometer(100)</code>时,<code>self</code>参数引用<code>new_car</code>。在</p>
<p><code>joyride</code>是一个函数。它不是任何类的一部分,并且它没有<code>self</code>参数。这是方法和函数之间唯一的区别。在</p>
<p>(实际上,在Python中,方法只是将函数和实例放在一起的一种方式。例如,<code>new_car.drive.im_self</code>是<code>new_car</code>。但别担心。)</p>
<p>请注意,<code>joyride</code>内部,<code>stolen_car</code>是您在本例中传递的同一个对象,<code>new_car</code>。所以,你可以调用<code>stolen_car.drive()</code>,它在驱动<code>new_car</code>。在</p>
<p>在实际代码中,您通常不必费心使用<code>set_odometer</code>和<code>get_odometer</code>等方法,因为您可以像访问方法一样轻松地访问数据属性,也就是成员,比如<code>miles</code>:</p>
^{pr2}$
<p>但是,您经常在一个特殊的<code>__init__</code>方法中为属性设置初始值。例如:</p>
<pre><code>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!'
</code></pre>
<hr/>
<p>那么,这如何适用于你的例子呢?在</p>
<p>你的例子有点让人困惑。你根本不调用任何普通的实例方法。但让我们一步一步来。在</p>
<pre><code>from datetime import datetime
</code></pre>
<p><code>datetime</code>是一个类。你怎么知道的?好吧,您可以查看<code>datetime</code>模块中的代码,但更简单的是,只需打印它:</p>
<pre><code>>>> from datetime import datetime
>>> print datetime
<type 'datetime.datetime'>
</code></pre>
<p>松散地说,a <code>type</code>和<code>class</code>是一回事。(实际上,<code>type</code>可以用定制的C代码编写,而不是使用<code>class</code>等等,所以这并不完全正确,但已经足够接近了。)</p>
<pre><code>now = datetime.now()
</code></pre>
<p><code>datetime.now</code>是一种称为<code>classmethod</code>的特殊类型的东西。普通方法只能在实例上调用,但类方法只能在类上调用。暂时不要担心这个。重要的是它返回的是一个对象,一个<code>datetime</code>类型的实例。同样,您可以通过打印出它的<code>type</code>进行测试:</p>
<pre><code>>>> now = datetime.now()
>>> print type(d)
<type 'datetime.datetime'>
</code></pre>
<p>然后访问对象的一些数据属性:</p>
<pre><code>month1 = now.month
year1 = now.year
day1 = now.day
</code></pre>
<p>这些属性是通过<code>now</code>方法设置的,这与普通类在其<code>__init__</code>方法中设置属性的方式大致相同。在</p>