Python 点符号和日期时间对象

标签 python datetime

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

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/

相关文章:

python - Scikit-learn 不适用于 KNN 上的字符串值

python - Pandas - 从字典列表创建 df

javascript - 如何将其序列化为 JSON?

c# - 秒表和 DateTime.UtcNow 产生意外大的时间变化

Python - strptime 值错误 : time data does not match format '%Y/%m/%d'

c# - 使用 HttpClient 通过 AttributeRouting 在 URL 中发送日期

python - 决策树分类器如何处理全局约束?

python - 努力用 pip 安装 pygtk

c# - Json 日期时间问题

python - 在不触发 __init__ 的情况下调用类函数