在运行时使用函数重载方法

ric*_*cho 4 python metaprogramming

好的,我会先前承认这是一个巨大的问题,我可以肯定地更好地实现这一点.只有病态的好奇心才能让我知道如何做到这一点.

class SomeClass(object):
    def __init__(self):
        def __(self, arg):
            self.doStuff(arg)
        self.overLoaded = __
    def doStuff(self, string):
        print string

SomeClass().overLoaded("test string")
Run Code Online (Sandbox Code Playgroud)

这会返回一个参数错误,因为我只为overLoaded()提供一个参数而不是两个参数.是否有一些魔法告诉解释器它现在是一个类的方法(我尝试用@classmethod进行装饰,我总是理解这是它的目的??)

sj2*_*j26 8

不用担心自身参数,功能已经从本地范围有了.

class SomeClass(object):
    def __init__(self):
        def __(arg):
            self.bar(arg)
        self.foo = __
    def foo(self, arg):
        print "foo", arg
    def bar(self, arg):
        print "bar", arg

SomeClass().foo("thing") # prints "bar thing"
Run Code Online (Sandbox Code Playgroud)

在创建实例(after __new__,iirc,但之前__init__)时,Python会绑定所有方法以自动提供实例作为第一个参数.如果您稍后添加方法,则需要手动提供实例.在定义self已在范围内的函数时,您不需要再次传递它.

Python的new模块不是一个解决方案,因为自2.6以来它已被弃用.如果你想创建一个"真正的"实例方法,请使用如下的部分装饰器:

import functools

class SomeClass(object):
    def __init__(self):
        def __(self, arg):
            self.bar(arg)
        self.foo = functools.partial(__, self)
    def foo(self, arg):
        print "foo", arg
    def bar(self, arg):
        print "bar", arg

SomeClass().foo("thing") # prints "bar thing"
Run Code Online (Sandbox Code Playgroud)