如果函数或方法调用中省略括号,则意味着什么?

2024-12-16 08:35:00
admin
原创
179
摘要:问题描述:我有这个示例代码:class objectTest(): def __init__(self, a): self.value = a def get_value(self): return self.value a = objectTest(1) ...

问题描述:

我有这个示例代码:

class objectTest():
    def __init__(self, a):
        self.value = a

    def get_value(self):
        return self.value

a = objectTest(1)
b = objectTest(1)
        
print(a == b)
print(a.get_value() == b.get_value)
print(a.get_value() == b.get_value())
print(a.get_value == b.get_value)

显示结果为:

False
False
True 
False

为什么这不会导致错误get_value是一个方法,那么为什么我们可以这样使用它而不先调用它呢?


另请参阅:在 Python 中,“<function at ...>”是什么意思?


解决方案 1:

如上所述,函数和方法是一等对象。通过在末尾添加一些括号(方括号)来调用它们。但看起来你想要更多的动机来了解为什么 Python 甚至允许我们这样做。我们为什么要关心函数是否是一等的?

有时您不想调用它们,而是想要传递对可调用函数本身的引用。

from multiprocessing import Process
t = Process(target=my_long_running_function)

如果你在上面后面加上括号,它会my_long_running_function在主线程中运行;这几乎不是你想要的!你想给Process你的可调用函数一个引用,它将在新的进程中运行。

有时您只想指定可调用函数并让其他东西...

def do_something(s):
    return s[::-1].upper()

map(do_something,['hey','what up','yo'])
Out[3]: ['YEH', 'PU TAHW', 'OY']

map在本例中)填写其参数。

也许您只是想将一堆可调用函数放入某个集合中,然后以动态方式获取所需的函数。

from operator import *

str_ops = {'<':lt,'>':gt,'==':eq} # etc
op = str_ops.get(my_operator)
if op:
    result = op(lhs,rhs)

以上是将运算符的字符串表示映射到其实际操作的一种方法。

解决方案 2:

Python 中的函数和方法本身也是对象。因此,你可以像比较任何其他对象一样比较它们。

>>> type(a.get_value)
<type 'instancemethod'>
>>> type(a.get_value())
<type 'int'>

当然,通常情况下,您不会将方法相互比较或与其他任何东西进行比较,因为它不是很有用。它很有用的一个地方是当您想要将一个函数传递给另一个函数时。一种常见的用法是用于不区分大小写的字符串排序,方法是告诉它使用str.lower作为生成排序键的方法:

>>> list_of_strings=['A','b','C']
>>> sorted(list_of_strings)
['A', 'C', 'b']
>>> sorted(list_of_strings, key=str.lower)
['A', 'b', 'C']

解决方案 3:

def mul(a, b):
    return a * b

def add(a, b):
    return a + b

def do(op, a, b):
    return op(a, b)

do(add, 2, 3)  # return 5

解决方案 4:

print(a.get_value() == b.get_value)   # 1
print(a.get_value() == b.get_value()) # 2
print(a.get_value == b.get_value)     # 3

1)调用的返回值是否a.get_value()等于方法的返回值b.get_value

2)a.get_value()返回的结果是否相同b.get_value()

3)方法引用是否a.get_value等于方法引用b.get_value

这是完全有效的 Python :)

解决方案 5:

一些评论者想要一个示例来说明这在何处有用。一个应用是在线程中。我们需要将目标传递给线程而不使用括号。否则,目标将在主线程中创建,这正是我们要避免的。

例子:

在 test1.py 中我调用 ThreadTest 而不使用括号。test_thread 在线程中启动并允许 test1.py 继续运行。

在 test2.py 中,我传递了 ThreadTest() 作为目标。在这种情况下,线程不允许 test2.py 继续运行。

测试1.py

import threading
from thread_test import ThreadTest

thread = threading.Thread(target=ThreadTest)
thread.start()
print('not blocked')

测试2.py

import threading
from thread_test import ThreadTest

thread = threading.Thread(target=ThreadTest())
thread.start()
print('not blocked')

测试线程.py

from time import sleep


class ThreadTest():
    def __init__(self):
        print('thread_test started')
        while True:
            sleep(1)
            print('test_thread')

test1.py 的输出:

thread_test started
not blocked
test_thread
test_thread
test_thread

test2.py 的输出:

thread_test started
test_thread
test_thread
test_thread

我在 Linux Mint 上使用 python3.5。

解决方案 6:

不带括号的函数和带括号的函数之间的区别在于,当使用括号时,您将获得该函数的输出,而当您使用不带括号的函数时,您将创建该函数的副本。例如

def outerFunction(text): 
    text = text 

    def innerFunction(): 
        print(text) 

    return innerFunction()

if __name__ == '__main__': 
    outerFunction('Hey!') 
    x = outerFunction
    y = x 
    x('Hey i am busy can you call me later')
    y('this is not a function')

这里我们将函数 outerFunction 复制到 x 然后将 y 复制到 x。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2209  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1479  
  BIM 与 PLM 集成的基础认知BIM(建筑信息模型)作为一种数字化技术,它以三维模型为载体,整合了建筑项目全生命周期内各个阶段的丰富信息,涵盖从设计理念的诞生到建筑物拆除的全过程。通过 BIM,项目团队成员能够在一个协同的平台上进行信息共享与交流,提前发现设计冲突、施工难点等问题,有效减少错误和变更。PLM(产品生...
plm合规性管理   0  
  引言PLM(产品生命周期管理)项目对于企业的产品创新、成本控制以及市场竞争力提升至关重要。在PLM项目实施过程中,采购策略的优化直接影响项目的成败与整体效益。随着市场环境的变化和企业需求的不断演进,到2025年,基于风险登记册的供应商评估模型将成为优化采购策略的关键手段。有效的采购策略不仅能确保获得高质量的产品和服务,...
plm主要包含哪四个模块   1  
  制造企业 PLM 选型的重要性制造企业在当今复杂多变的市场环境中,面临着诸多挑战,从产品的创新研发到高效生产,再到成本的有效控制,每一个环节都关乎企业的生存与发展。而产品生命周期管理(PLM)系统作为整合产品全生命周期信息的关键工具,其选型的正确性直接影响着企业能否实现战略目标。一个合适的 PLM 系统能够帮助企业优化...
plm系统主要干什么的   1  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用