我有两节课。 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
答案 0 :(得分:3)
这有效:
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
,因为如果您在obj.attribute_function()
无效或已更改的地方致电self
,则无法找到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()
答案 1 :(得分:0)
您的示例无效,因为您在temp
您已将temp
指定为两种方法:
def temp(self):
和一个属性:
self.temp = 10