首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python类对象属性引用

Python类对象属性引用
EN

Stack Overflow用户
提问于 2014-03-26 04:25:49
回答 2查看 57关注 0票数 0

我有两堂课。ab.

a的一种方法中,我创建了一个类b的对象。其中一个类b属性接受一个函数。所以假设我给了它一个随机函数,但是类b的这个函数可以访问类a的属性吗?即使我没有将它直接作为参数传递进来?

代码语言:javascript
复制
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应该如下所示:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-26 04:35:08

这样做是可行的:

代码语言:javascript
复制
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或使用其他selfself=self修复了这个问题。

但一般说来,这种魔法是反模式的。告诉我们你在努力实现什么,应该有更好的方法去做你想做的事情。否则,这类代码将确保许多头痛。

我认为这是一个更好的解决方案(称为策略模式):

代码语言:javascript
复制
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()
票数 3
EN

Stack Overflow用户

发布于 2014-03-26 04:35:27

您的示例不起作用,因为您在temp有一个名称冲突。

您已经将temp指定为两种方法:

代码语言:javascript
复制
def temp(self):

还有一个属性:

代码语言:javascript
复制
self.temp = 10
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22651457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档