gpt4 book ai didi

Python 点符号和日期时间对象

转载 作者:太空宇宙 更新时间:2023-11-03 15:53:23 25 4
gpt4 key购买 nike

谁能给我解释一下这段代码中的点符号?

now = datetime.now()

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

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

datetime = datetime()

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

如果这个问题完全没有意义,我很抱歉,因为我使用 Python 才一天。感谢您的宝贵时间。

最佳答案

您遇到了所谓的 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)

关于Python 点符号和日期时间对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45125168/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com