我有两堂课。a和b.
在a的一种方法中,我创建了一个类b的对象。其中一个类b属性接受一个函数。所以假设我给了它一个随机函数,但是类b的这个函数可以访问类a的属性吗?即使我没有将它直接作为参数传递进来?
class b:
def __init__(self):
self.attribute_function = None
class a:
def __init__(self):
self.temp = 10
self.counter = 0
def temp(self):
obj = b()
obj.attribute_function = lambda self: self.counter < self.temp
return obj.attribute_function()
if __name__ == "__main__":
#pass
obj = a()
print obj.temp()在上面的例子中,我试图提供一个非常基本的例子,但是如果您运行它,它就不能工作.
修改后的代码,类a应该如下所示:
class a:
def __init__(self):
self.temp = 10
self.counter = 0
def temp(self):
obj = b()
obj.attribute_function = lambda args: self.counter < self.temp
return obj.attribute_function(1) # i added this 1 to fill in arg发布于 2014-03-26 04:35:08
这样做是可行的:
class b:
def __init__(self):
self.attribute_function = None
class a:
def __init__(self):
self._temp = 10
self.counter = 0
def temp(self):
obj = b()
obj.attribute_function = lambda self=self: self.counter < self._temp
return obj.attribute_function()
if __name__ == "__main__":
obj = a()
print obj.temp()您遇到的问题是self.temp = 10,它隐藏了您的方法temp()。
另一个问题是:lambda self: self.counter < self._temp。你的lambda函数期待一个论点。但是,省略self并不是一个好主意,lambda : self.counter < self._temp,因为如果您在一个self不可用或已经更改的地方调用obj.attribute_function(),它将不会找到self或使用其他self。self=self修复了这个问题。
但一般说来,这种魔法是反模式的。告诉我们你在努力实现什么,应该有更好的方法去做你想做的事情。否则,这类代码将确保许多头痛。
我认为这是一个更好的解决方案(称为策略模式):
class B:
def __init__(self, a):
self.a = a
def temp(self):
return self.a.temp()
class A:
def __init__(self):
self._temp = 10
self.counter = 0
def temp(self):
return self.counter < self._temp
if __name__ == "__main__":
obj = B(A())
print obj.temp()发布于 2014-03-26 04:35:27
您的示例不起作用,因为您在temp有一个名称冲突。
您已经将temp指定为两种方法:
def temp(self):还有一个属性:
self.temp = 10https://stackoverflow.com/questions/22651457
复制相似问题