Python类对象属性引用

时间:2014-03-26 04:25:49

标签: python oop

我有两节课。 ab

在一个类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

2 个答案:

答案 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或使用其他selfself=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