python中的通用方法

时间:2011-06-24 11:58:41

标签: python

是否可以在python中实现通用方法处理程序,允许调用不存在的函数?像这样:

class FooBar:
  def __generic__method__handler__(.., methodName, ..):
    print methodName

fb = FooBar()
fb.helloThere()

-- output --
helloThere

3 个答案:

答案 0 :(得分:13)

要记住的第一件事是方法是恰好是callable的属性。

>>> s = " hello "
>>> s.strip()
'hello'
>>> s.strip
<built-in method strip of str object at 0x000000000223B9E0>

因此,您可以像处理不存在的属性一样处理不存在的方法。

这通常是通过定义__getattr__ method

来完成的

现在你要达到额外的复杂性,这是功能和方法之间的差异。需要将方法绑定到对象。您可以take a look at this question进行讨论。

所以我认为你会想要这样的东西:

import types

class SomeClass(object):
    def __init__(self,label):
        self.label = label

    def __str__(self):
        return self.label

    def __getattr__(self, name):
        # If name begins with f create a method
        if name.startswith('f'):
            def myfunc(self):
                return "method " + name + " on SomeClass instance " + str(self)
            meth = types.MethodType(myfunc, self, SomeClass)
            return meth
        else:
            raise AttributeError()

给出了:

>>> s = SomeClass("mytest")
>>> s.f2()
'method f2 on SomeClass instance mytest'
>>> s.f2
<bound method SomeClass.myfunc of <__main__.SomeClass object at 0x000000000233EC18>>

但是,我可能会建议不要使用它。如果你告诉我们你要解决的问题,我希望有人可以提出更好的解决方案。

答案 1 :(得分:6)

def __getattr__(self, name):
  #return your function here...

答案 2 :(得分:4)

class FooBar:
    def __getattr__(self, name):
        def foo():
            print name
        return foo

a = FooBar()
a.helloThere()