更新 - 2012/12/13
只是为了澄清 - 我对如何向课程添加方法并不感兴趣 - 正如你在我的问题和人们的答案中可以看到的那样,有不止一种方法可以做到这一点(舌头在脸颊和帽子尖端到我的Perl自我).
我感兴趣的是学习使用不同方法向类添加方法的根本区别,而大问题是为什么我需要使用元类.例如,Python Metaclass Programming的Primer声明:
也许最常见的使用元类[...]:为生成的类中定义的方法添加,删除,重命名或替换方法.
而且由于有更多方法可以做到这一点,我很困惑并寻找解释.
谢谢!
原创 - 2012/12/12
我需要动态地向类添加方法(以及基于该类的新生成的类).我提出了两种方法,一种涉及元类,另一种没有一种.除了事实上后者不涉及"黑魔法"元类之外,我看不出这两种方法给我带来的任何差别;)
方法#1 与元类:
class Meta(type):
def __init__(cls, *args, **kwargs):
setattr(cls, "foo", lambda self: "foo@%s(class %s)" % (self,
cls.__name__))
class Y(object):
__metaclass__ = Meta
y = Y()
y.foo() # Gives 'foo@<__main__.Y object at 0x10e4afd10>(class Y)'
Run Code Online (Sandbox Code Playgroud)
方法#2 没有元类:
class Z(object):
def __init__(self):
setattr(self.__class__, "foo",
lambda self: "foo@%s(class %s)" %
(self, self.__class__.__name__))
z = Z()
z.foo() # Gives 'foo@<__main__.Z object …Run Code Online (Sandbox Code Playgroud)