这个问题只是一种理解某事的尝试;我知道该怎么做,只想知道它们之间有什么区别:
datetime.datetime.now().date
和
datetime.datetime.now().date()
答案 0 :(得分:2)
括号调用一个函数。
datetime.datetime.now().date
Works ,因为它有效的语法,但是它给你的是方法本身,而不是调用方法的结果。
你可以在REPL中看到这个:
>>> datetime.datetime.now().date
<built-in method date of datetime.datetime object at 0x7fbb8ea17620>
和
>>> date_method = datetime.datetime.now().date
>>> actual_date = date_method()
>>> actual_date
datetime.date(2017, 11, 30)
答案 1 :(得分:1)
括号表示您实际上想要调用方法,而不是提及以供以后使用。在它自己的一行上,后者似乎没有意义,但在更大的表达式中,它允许延迟函数调用:
# access the "date" method, but don't call it yet
fn = datetime.datetime.now().date
... do other things ...
# *now* call date()
print(fn())
fn
中存储的可调用对象是绑定方法,它指的是具体对象。在Python中,方法调用和函数调用之间没有根本区别:按名称访问方法会创建绑定方法对象,然后将其作为任何其他函数调用。就Python而言,省略括号只是意味着你(还)没有兴趣调用它。
当你有一个接受可调用函数的函数时,这很有用。例如,想象一下调用一个事件处理器,它允许您为处理事件提供自定义调用。通常情况下,事件是通过GUI调度的,但您希望(暂时)想要收集刚刚创建的列表中的事件。这将是绑定方法的用例:
# library function that we cannot change
def do_processing(dispatchfn):
for event in something_that_generates_events():
... internal bookkeeping
# dispatch the event
dispatchfn(event)
# our code to log the events
log = []
do_processing(log.append)
# ... inspect the events list, e.g.:
for event in log:
print event
在这种情况下,使用绑定方法的替代方法是使用lambda
:
do_processing(lambda event: log.append(event))
但是lambda
的语义和性能略有不同。使用绑定方法实际上可以在非常紧密的循环中提高性能。 Python中流行的优化是转换紧密循环:
todo = deque()
while todo:
next_item = todo.popleft()
...
成:
todo = deque()
todo_popleft = todo.popleft
while todo:
next_item = todo_popleft()
...
如果while
循环确实很少,则此转换实际上可以提高性能,因为它消除了一次dict查找和创建绑定方法的成本。这不是常规应该做的事情,但它是未被称为绑定方法的公认用法。
答案 2 :(得分:0)
括号表示对method的调用。
答案 3 :(得分:0)
date
是datetime
的一种方法。无论何时你想要调用(或调用)该方法所需的日期 - 以及使用括号的方式。当您不使用括号时,您访问的是函数本身作为对象。