在类函数中定义类函数:Python

3

我有一段代码,想在类函数内部定义另一个类函数。这里是一个更简单的例子,演示我想要做的事情。该程序的目标是打印出4。

>>> class bluh:
...     def haha(self):
...             print 3
...     def __init__(self):
...             def haha(self):
...                     print 4
... 
>>> x = bluh()
>>> x.haha()
3

我该如何编写程序以实现我想要的功能?


3
如果您的目标是打印数字4,为什么不只是将“haha”定义为常规方法呢?通过这种方式,您希望获得什么收益? - BrenBarn
2
我的目标并不是真的要打印出4。这只是我尝试做的事情的一个简化版本,其中涉及控制语句、许多其他方法等等。我几乎在帖子的最后加了一段解释这一点的内容,但最终决定大部分经常访问这个网站的人应该能够理解。 - IronBeard
1
问题是,你还没解释为什么你觉得首先需要使用嵌套函数。 - BrenBarn
2个回答

9
这真的取决于你想做什么。
>>> class Foo(object):
...     def haha(self):
...         print 3
...     def __init__(self):
...         def haha():
...             print 4
...         self.haha = haha
... 
>>> a = Foo()
>>> a.haha
<function haha at 0x7f4539e25aa0>
>>> a.haha()
4

在前面的例子中,haha 实际上不是一个方法--它只是一个函数。但它将从闭包中获取对 self 的引用,大多数情况下,这可能已经足够了。如果您真的想在实例上猴子补丁/鸭子补丁一个新方法,您需要使用 types.MethodType。请参见 此处 的示例。

0
这将为一个实例添加一个方法到一个类中。 在大多数情况下,这不是你想要做的事情,但编程语言使它变得非常简单。
class A(object):
    def __init__(self):
        def foo(self):
            print "bar"
        self.__class__.foo = foo 

当你构建某种数据驱动的自修改代码时(对于我们大多数人来说并不是每天都会遇到的情况),使用这样的技巧是可以被证明是合理的。

1
每当有人做类似的事情时,Guido就会杀一只小猫,我听说过这样的事情。 - bereal
这取决于你想要实现什么目标。我们不应该经常这样做,但我可以看到这种技术有一些很好的用途。 - mderk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接