可以在python类中创建一个def,即使def不存在,也可以调用def名称

时间:2015-04-25 17:05:24

标签: python function

我希望做这样的事情:

class MyClass(Object):
    def ****(self):
        print self.__name __

MyClass.test()
->test

MyClass.whatever()
->whatever

所以你可以调用任何方法并输出名称。

1 个答案:

答案 0 :(得分:2)

在您的类上实现__getattr__() method以拦截对未知属性的访问尝试,并返回一个函数(您可以绑定到该类):

class MyClass(object):
    def __getattr__(self, name):
        def echo():
            return name
        return echo

这将返回未绑定的函数,而不引用该实例。

您需要先创建一个实例才能使其正常工作:

>>> class MyClass(object):
...     def __getattr__(self, name):
...         def echo():
...             return name
...         return echo
... 
>>> instance = MyClass()
>>> instance.test()
'test'
>>> instance.whatever()
'whatever'

您可以通过手动调用descriptor protocol将函数绑定到实例(因此传入self),在返回函数之前调用__get__

class MyClass(object):
    def __getattr__(self, name):
        def echo(self):
            return '{}.{}'.format(type(self).__name__, name)
        return echo.__get__(self, type(self))

访问self我们可以打印更多信息:

>>> class MyClass(object):
...     def __getattr__(self, name):
...         def echo(self):
...             return '{}.{}'.format(type(self).__name__, name)
...         return echo.__get__(self, type(self))
... 
>>> instance = MyClass()
>>> instance.test()
'MyClass.test'
>>> instance.whatever()
'MyClass.whatever'