谁能给我解释一下这段代码中的点符号?
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/