首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在python中使对象可调用的问题

在python中使对象可调用的问题
EN

Stack Overflow用户
提问于 2009-11-10 14:06:35
回答 2查看 11.9K关注 0票数 22

我写了这样的代码

代码语言:javascript
复制
>>> class a(object):
        def __init__(self):
            self.__call__ = lambda x:x

>>> b = a()

我原以为a类的对象应该是可调用的对象,但最终却不是。

代码语言:javascript
复制
>>> b()

Traceback (most recent call last):
    File "<pyshell#5>", line 1, in <module>
        b()
TypeError: 'a' object is not callable
>>> callable(b)
False

>>> hasattr(b,'__call__')
True
>>> 

我不明白为什么。请帮帮我。

EN

回答 2

Stack Overflow用户

发布于 2009-11-10 14:12:50

需要在类上定义__call__,而不是在实例上

代码语言:javascript
复制
class a(object):
    def __init__(self):
        pass
    __call__ = lambda x:x

但是大多数人可能会发现用通常的方式定义方法更具可读性。

代码语言:javascript
复制
class a(object):
    def __init__(self):
        pass
    def __call__(self):
        return self

如果你需要每个实例有不同的行为,你可以这样做

代码语言:javascript
复制
class a(object):
    def __init__(self):
        self.myfunc = lambda x:x

    def __call__(self):
        return self.myfunc(self)
票数 18
EN

Stack Overflow用户

发布于 2011-03-21 10:03:57

那这个呢?定义一个基类AllowDynamicCall:

代码语言:javascript
复制
class AllowDynamicCall(object):
     def __call__(self, *args, **kwargs):
         return self._callfunc(self, *args, **kwargs)

然后是AllowDynamicCall的子类:

代码语言:javascript
复制
class Example(AllowDynamicCall):
     def __init__(self):
         self._callfunc = lambda s: s
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1705928

复制
相关文章

相似问题

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