在Python中使用lambda在循环中用另一个方法替换一个方法

2024-04-25 07:17:54 发布

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

这是一个我想要达到的目标的例子。该类有一个someMethod,在创建实例时必须用其他方法(在本例中是returnStuff)替换它。我使用lambda替换这个方法,因为新方法有一个参数。从循环运行替换的方法不会引起问题,但是在循环之后运行它会将所有参数转换为相同的值。手动更换方法也可以。代码打印出理解问题所需的所有信息。你知道吗

def returnStuff(stuff):
    return stuff


class SomeClass(object):
    def __init__(self):
        pass

    def someMethod(self):
        pass


classInstances = []

#RUN METHODS WITHIN CREATION LOOP
print 'STARTING CREATION LOOP:\n'

for i in range(1, 6):
    classInstance = SomeClass()

    classInstances.append(classInstance)

    classInstance.someMethod = (lambda: returnStuff(i))

    print 'I was returned from the Creation Loop and I am fabulous: ', classInstance.someMethod(), '\n'


print '====================================================================\n'
print 'RUN METHODS AFTER THE LOOP:\n'

#CALLING METHODS LATER ON
for inst in classInstances:
    print 'I was returned after creation, and I am not who I want to be: ', inst.someMethod(), '\n'

print '====================================================================\n'
print 'TRYING MANUAL APPROACH (NO LOOP):\n'

classInstance1 = SomeClass()
classInstance1.someMethod = (lambda: returnStuff(1))
print 'I was returned from the manually replaced method. I\'m pretty fine: ', classInstance1.someMethod(), '\n'

classInstance2 = SomeClass()
classInstance2.someMethod = (lambda: returnStuff(2))
print 'I was returned from the manually replaced method. I\'m pretty fine: ', classInstance2.someMethod(), '\n'

classInstance3 = SomeClass()
classInstance3.someMethod = (lambda: returnStuff(3))
print 'I was returned from the manually replaced method. I\'m pretty fine: ', classInstance3.someMethod(), '\n'

classInstance4 = SomeClass()
classInstance4.someMethod = (lambda: returnStuff(4))
print 'I was returned from the manually replaced method. I\'m pretty fine: ', classInstance4.someMethod(), '\n'

classInstance5 = SomeClass()
classInstance5.someMethod = (lambda: returnStuff(5))
print 'I was returned from the manually replaced method. I\'m pretty fine: ', classInstance5.someMethod(), '\n'

Tags: the方法lambdafromprettymethodprintmanually
1条回答
网友
1楼 · 发布于 2024-04-25 07:17:54

而不是使用lambda(它不能正确地为i变量创建闭包)。您应该只使用部分或其他函数工厂。你知道吗

例如

from functools import partial
for i in range(1, 6):
    classInstance = SomeClass()
    classInstances.append(classInstance)
    classInstance.someMethod = partial(returnStuff, i)

或者

def methodFactory(n):
  def returnStuff():
    return n

for i in range(1, 6):
  classInstance = SomeClass()
  classInstances.append(classInstance)
  classInstance.someMethod = methodFactory(i)

相关问题 更多 >