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进行装饰,我总是理解这是它的目的??)
不用担心自身参数,功能已经从本地范围有了.
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)