gpt4 book ai didi

python - 使用 lambda 的魔术方法

转载 作者:行者123 更新时间:2023-12-01 04:11:08 25 4
gpt4 key购买 nike

我正在尝试使用type动态创建对象。具体来说,我想创建一个具有 len 的 float 。

这是我尝试过的:

_float = type('_float', (float,), {})

另一个文件,其中是使用函数(构造函数)引用创建的实例:

obj = x[1](x[0])  # `x` is a 2-length tuple: (value, function)

obj.old = x[0]
obj.__len__ = lambda: len(x[0]) # I'm not sure if this lambda should take argument 'self'

out.append(obj) # 'out' is a list of output

此代码处于循环中,完成后,我运行以下代码(用于测试错误在哪里):

print(out[0].old)  # => 1, correct
print(out[0].__len__) # <function bla.bla.<lambda> at: 0xblabla>
print(out[0].__len__()) # 1, correct (number of digits)
print(len(out[0])) # TypeError: object of type '_float' has no len()

基本思想是用户导入我的模块,为其提供一个 str 值和一个函数。然后,我的模块的对象将该函数应用于 str 值并返回结果对象。但是,它必须保留原始值或至少保留其 __len__

最佳答案

这是 python 3 和 python 2 之间的区别之一。这在 python 2 中可以工作(使用“旧样式”类),但在 python 3 中失败。

例如,在 python 2 中,以下工作有效:

class test: pass # "old style" class
a = test()
a.__len__ = lambda: 10
len(a) # 10

但这不是

class test(object): pass # inherit from object, "new style" class
a = test()
a.__len__ = lambda self: 10
len(a) # TypeError: object of type 'test' has no len()

它在 python 3 中不起作用,因为所有类都是“新样式”。

本质上,在新样式类中,任何使用内置重载方法(两侧带有双下划线的方法)的东西都将完全绕过实例,并直接进入类。

只要在类上定义方法,它就可以正常工作。例如(python 3)

class test: pass
test.__len__ = lambda self: 10
a = test()
len(a) # 10

事实上,您甚至可以在创建实例后创建该方法

class test: pass
a = test()
a.__class__.__len__ = lambda self: 10
len(a) # 10

搜索“python 新样式类方法查找”应该会为您提供比您想要的更多信息。此外,学习 Python,第五版(Oreilly,2013 年)的第 32 章和第 38 章深入讨论了这些差异。

关于python - 使用 lambda 的魔术方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34944336/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com