Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
动态重写Python中的函数_Python - Fatal编程技术网

动态重写Python中的函数

动态重写Python中的函数,python,Python,假设我想在Python类中重写一个函数,比如\uuuu int\uuu,这样我就可以这样做 class A(object): def __init__(self): self.__int__ = lambda: 1 a = A() print int(a) 我希望它在这里输出“1”,而不是生成此错误消息 TypeError:int()参数必须是字符串或数字,而不是“a” 当\uuuu int\uuuu变为类中内置的方法时,它会按预期工作。为什么?(任何双下划线函数也存

假设我想在Python类中重写一个函数,比如
\uuuu int\uuu
,这样我就可以这样做

class A(object):
    def __init__(self):
        self.__int__ = lambda: 1

a = A()
print int(a)
我希望它在这里输出“1”,而不是生成此错误消息

TypeError:int()参数必须是字符串或数字,而不是“a”


\uuuu int\uuuu
变为类中内置的方法时,它会按预期工作。为什么?(任何双下划线函数也存在此问题)

这似乎是
魔术方法中的又一个魔术。与其他方法不同,它们在隐式调用时不会查找类实例

有很好的文档证明,它们不能通过
\uuuuuuGetAttribute\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。但不检查实例让我感到惊讶

这里在标题“特殊方法查找”下讨论了一下:

对于新样式类的实例,隐式完成的所有特殊方法查找都在类结构中完成。因此,更改实例的
\uuu str\uu
属性不会影响str()的结果。不过,明确地从实例中获取属性将为您提供实例中的方法


我很想知道是否有其他人可以提供更详细的解释。

如果我们暂时忽略您询问的特殊方法,那么您的代码将如下所示:

class A(object):
    def __init__(self):
        self.a_fun = lambda: 1
class A(object):
    def __init__(self):
        self._int = 1

    def a_fun(self):
        return self._int
class A(object):
    def __init__(self):
        self.__int__ = lambda: 1
这样写得更清楚:

class A(object):
    def __init__(self):
        self.a_fun = lambda: 1
class A(object):
    def __init__(self):
        self._int = 1

    def a_fun(self):
        return self._int
class A(object):
    def __init__(self):
        self.__int__ = lambda: 1
生成的代码并不完全相同,但非常接近,不会产生太大的差异。唯一的区别是,
\u int
名称必须作为属性进行查找

但是如果我们现在把它改回一个特殊的方法,它看起来是这样的:

class A(object):
    def __init__(self):
        self.a_fun = lambda: 1
class A(object):
    def __init__(self):
        self._int = 1

    def a_fun(self):
        return self._int
class A(object):
    def __init__(self):
        self.__int__ = lambda: 1
vs:

现在有一个非常大的区别:第二个变体有效,第一个不起作用。这是因为特殊方法总是在类上查找,而不是在实例上查找。这是故意的


因此,与其试图变得聪明,不如写清楚易读的东西。在Python中,这往往是最有效的

重复,主题是相似的,但这是问题的一个更简洁和一般的版本是的,但答案是相同的。快速回答:你不能。不那么快的回答:为什么会想?好奇。我在一个项目中玩弄一个设计思想,遇到了这个问题。这让我很困惑,所以我问。这不是对吗?
结果代码不完全相同。。。你能详细解释一下吗?我不是想耍聪明。甚至不要让我开始讲它是如何牺牲可读性的。@Mike:我已经详细说明过了:唯一的区别是必须将_intname作为一个属性来查找。是的。我错过了。谢谢你的回复。