有人能解释一下这段代码中的点符号吗?
now = datetime.now()
我知道now()
指的是属于类datetime的方法。请查看datetime.py
module if needed。
我感到困惑的是now = datetime.now()
的“日期时间”部分。我在某处读到它应该是now()
方法所属的类的实例(如果查看模块,该类也称为datetime),不是吗?因为实例不应该有代码行
datetime = datetime()
这是为了指定datetime实例是datetime类的一部分吗?
如果这个问题毫无意义,我很抱歉,因为这是我用Python以来的一天。谢谢你的时间。
答案 0 :(得分:3)
你遇到了所谓的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)
答案 1 :(得分:0)
我假设您使用set GH=C:\Git2.13.3
set PATH=%GH%\bin;%GH%\usr\bin;%GH%\mingw64\bin;%PATH%
导入datetime
,在这种情况下,您确实导入了from datetime import datetime
类。
但是,如果您不想使用某些方法,则不必先创建该类的实例。具体来说,datetime
的使用非常普遍,是正确的用途。
在这种情况下,点符号指示python使用类datetime.now()
的方法now
,并且没有矛盾。