Python中奇怪的函数/类转换。为什么我们有它?

2024-04-26 00:18:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我发现用

(int)('123')

与使用int('123')相同

我对它进行了一些探索,发现它也可以与其他函数一起工作。你知道吗

def add_10(num):
    return num + 10

print (add_10)(10) # prints 20

它也适用于类

class MyClass(object):
    def __init__(self, x):
        self.x = x

print (MyClass)(10).x  # returns 10

我以前从没见过这种行为,有人用过吗?这个有名字吗?在文件的哪一部分有说明?为什么我们有这个?你知道吗

它可以在Python2.7和Python3中工作。你知道吗

编辑:

进一步测试,我注意到括号没有任何效果。使用((((int))))('2')int('2')相同


Tags: 函数selfaddreturnobjectinitdefmyclass
3条回答

换言之,Python中的函数只是一个普通对象。你知道吗

在一个对象的名称后面加上一对圆括号,不管它是什么,都会导致调用前一个对象,也就是说,它的__call__方法与传递的参数一起被调用。你知道吗

因此,Python中的名称,无论是否来自函数,都可以用括号括起来。括号将首先解析为表达式-so- 在(int)(5)中,(int)被处理为产生int的表达式。恰好是一个可调用的对象。你知道吗

使其更容易理解的一种方法是使括号中的表达式不那么琐碎。例如,可以提出“addable functions”,在添加时创建一个新的可调用对象,将返回值链接到所有函数。这样做或多或少很简单:

def compose(func1, func2):
    def composed(*args, **kw):
        return func2(func1(*args, **kw))
    return composed

class addable(object):
    def __init__(self, func):
        self.func = func
    def __add__(self, other):
        if callable(other):
            return addable(compose(self.func, other))
        raise TypeError
    def __call__(self, *args, **kw):
        return self.func(*args, **kw)


@addable
def mysum(a, b):
    return a + b

@addable
def dup(a):
    return a * 2

在交互控制台上的工作方式如下:

>>> (mysum + dup)(3, 3)
12
>>> 

你可以用括号括住任何表达式。一种表达方式是名字。名称可以引用任何值,字符串、函数和类型都是不同类型的值。多层括号也不是特别的:因为带括号的表达式也是表达式,所以可以将它们放在括号中。你知道吗

您可以添加parenthesis in many places,而不影响代码的运行方式:

>>> (1)+(2)
3
>>> (1)+(((2)))
3
>>> (((int)))('123')
123

它不是强制转换,只是用括号包围函数对象。你知道吗

相关问题 更多 >