【问题标题】:Why is it possible to call python's datetime.datetime without using ( )?为什么不用()就可以调用python的datetime.datetime?
【发布时间】:2022-01-22 10:04:57
【问题描述】:

我想知道为什么会这样

import datetime as dt

test1 = dt.datetime
print(test)

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

据我了解python,要创建一个类的实例,你需要用这样的括号来调用它:

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

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

起初我认为像第一个示例(不带括号)那样调用 datetime 必须是属性或其他东西。但我在“日期时间”类中找不到单个常设属性“日期时间”。

有趣的是——不管你怎么称呼它,因为这两行都会导致相同的结果:

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

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

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

【问题讨论】:

  • dt.datetime 是类datetime,而不是它的实例。
  • dt.datetime datetime.datetime,因为你做了import datetime as dt。这里的dt 指的是模块datetime
  • 在第一种情况下,您只是打印类标识符本身,而不是类中的方法
  • 您可以在dt.datetime 的实例上运行dt.datetime.now() 或调用now(),因为实例可以访问类方法
  • 如果您熟悉打开文件,您会感到惊讶吗print(open)?您没有为该函数提供任何要打开的文件,但它仍然会打印一些东西!根本没有调用,你只是打印方法的__repr__

标签: python datetime call brackets


【解决方案1】:

这里有一些东西要解压。

import datetime as dt

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

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

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

查看模块中datetime类的定义:

# 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

类方法可以在类(例如C.f())或 一个实例(例如C().f())。该实例被忽略,除了它的 类。

【讨论】:

  • 非常感谢 - 这对我有帮助 :-) 正如 Charles Duffy 所写:“这个问题基于一个错误的前提。” .我太专注于在“datetime”类中找到一个类属性“datetime”,我完全忽略了一个事实,即“dt.datetime”是对类本身的引用,而不是对实例的引用。再次感谢大家的快速和良好的支持!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多