Python点表示法和日期时间对象

时间:2017-07-16 04:58:15

标签: python datetime

有人能解释一下这段代码中的点符号吗?

now = datetime.now()

我知道now()指的是属于类datetime的方法。请查看datetime.py module if needed

我感到困惑的是now = datetime.now()的“日期时间”部分。我在某处读到它应该是now()方法所属的类的实例(如果查看模块,该类也称为datetime),不是吗?因为实例不应该有代码行

datetime = datetime()

这是为了指定datetime实例是datetime类的一部分吗?

如果这个问题毫无意义,我很抱歉,因为这是我用Python以来的一天。谢谢你的时间。

2 个答案:

答案 0 :(得分:3)

你遇到了所谓的class method

通过查看代码,有几种方法可以解决这个问题:

首先,datetime.datetime.now()真的是一个实例吗?如果你要在翻译中输入datetime.datetime,这就是你得到的:

>>> datetime.datetime
<type 'datetime.datetime'>

Datetime是一个类。要实例化它,你想要调用它:

>>> datetime.datetime(2017, 7, 16, 1, 1, 47)
datetime.datetime(2017, 7, 16, 1, 1, 47)

带参数的()括号创建该类的实例。但是当我们调用这个now()方法时,没有任何括号!

>>> datetime.datetime.now()
datetime.datetime(2017, 7, 16, 1, 3, 30, 501644)

那是因为now()是一种类方法。换句话说,我们不需要类的实例来调用它。

如果您熟悉类实例和类定义,可能之前已经写过:

class Hello(object):
    def say_message(self, message):
        print(message)

看到该方法中首先出现的方便的小self参数? self指向传递的类的实例。这称为实例方法。类方法不提供实例,而是提供类定义。所以它不需要实例。

当您使用继承和快捷方式初始化进行高级操作时,类方法会更有用。

类方法通常用装饰器定义:

@classmethod
def now(cls):
    ...

这实际上和写这个一样:

def now(cls):
    ...

now = classmethod(now)

装饰器是作为PEP 318的一部分引入的,并在Python 2.4中引入了该语言。在引入装饰器之前,总是使用上面的第二种方法。那是因为装饰器是功能。 @语法只是为了使这种“装饰”更具可读性和清晰度。我会阅读PEP,因为它有很多关于如何以及为什么装饰器被引入语言的好信息。在datetime.now的情况下,您可以看到第二种方法用于将方法转换为类方法(它们使用所有类方法执行此操作,包括其他方法,如fromtimestamp

def now(cls, tz=None):
    "Construct a datetime from time.time() and optional time zone info."
    t = _time.time()
    return cls.fromtimestamp(t, tz)
now = classmethod(now)

答案 1 :(得分:0)

我假设您使用set GH=C:\Git2.13.3 set PATH=%GH%\bin;%GH%\usr\bin;%GH%\mingw64\bin;%PATH% 导入datetime,在这种情况下,您确实导入了from datetime import datetime类。

但是,如果您不想使用某些方法,则不必先创建该类的实例。具体来说,datetime的使用非常普遍,是正确的用途。

在这种情况下,点符号指示python使用类datetime.now()的方法now,并且没有矛盾。