这是一个我想要达到的目标的例子。该类有一个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'
而不是使用lambda(它不能正确地为
i
变量创建闭包)。您应该只使用部分或其他函数工厂。你知道吗例如
或者
相关问题 更多 >
编程相关推荐