为什么不使用 ( ) 就可以调用 python 的 datetime.datetime?

Why is it possible to call python's datetime.datetime without using ( )?

我想知道为什么会这样

import datetime as dt

test1 = dt.datetime
print(test)

''' prints: <class 'datetime.datetime'>'''

据我了解 python,要创建 class 的实例,您需要用方括号调用它,如下所示:

test2 = dt.datetime(2021, 12, 31)

(调用构造方法强制输入年月日)

一开始我以为像第一个例子(没有括号)那样调用datetime一定是一个属性什么的。但是我在class“datetime”中找不到一个单一的常设属性“datetime”。

有趣的是 - 你怎么称呼它并不重要,因为两条线导致相同的结果:

test = dt.datetime
test2 = dt.datetime(2021, 12, 31)

print(test.now())
print(test2.now())

但是为什么呢?我错过了什么? 非常感谢!

这里有一些东西要打开。

import datetime as dt

这会导入日期时间 模块 并将其别名为 dt。接下来,dt.datetime 是模块 dt 中的 class datetimedatetime 模块的别名)。最后,now() 被定义为 class 方法,因此不需要实例化。因此,dt.datetime.now() 调用模块 dt 的 class datetime 的 class 方法 now 而以下内容:

date = dt.datetime(2021, 1, 1)
date.now()

创建 datetime class 的实例,然后让它访问 class 方法 now

datetimeclass模块内的定义:

# Excerpt of datetime.py on Python 3.8.10
class datetime(date):
    @classmethod
    def now(cls, tz=None):
        "Construct a datetime from time.time() and optional time zone info."
        t = _time.time()
        return cls.fromtimestamp(t, tz)

最后,看这里Python reference has to say on the classmethod decorator:

A class method can be called either on the class (such as C.f()) or on an instance (such as C().f()). The instance is ignored except for its class.