更新 - 2012/12/13
只是为了澄清 - 我对如何向类添加方法不太感兴趣 - 正如您在下面我的问题和人们的回答中看到的那样,有不止一种方法可以做到这一点(开玩笑和帽子提示我的 Perl 自我)。
我感兴趣的是了解使用不同方法向类添加方法的根本区别是什么,而最大的问题实际上是为什么我需要使用元类。例如Python 元类编程入门 http://onlamp.com/pub/a/python/2003/04/17/metaclasses.html指出:
也许元类最常见的用途是:为生成的类中定义的方法添加、删除、重命名或替换方法。
由于有更多方法可以做到这一点,我很困惑并寻求解释。
Thanks!
原文 - 2012/12/12
我需要动态地将方法添加到类(以及基于该类的新生成的类)。我想出了两种方法,一种涉及元类,另一种不涉及元类。除了后者不涉及“黑魔法”元类这一事实之外,我看不出这两种方法给我带来了什么区别;)
方法#1 with元类:
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)'
方法#2 without元类:
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 at 0x10c865dd0>(class Z)'
据我所知,这两种方法都给了我相同的结果和“表现力”。即使当我尝试使用创建新类时type("NewClassY", (Y, ), {})
or type("NewClassZ", (Z, ), {})
我得到了相同的预期结果,这两种方法之间没有区别。
所以,我想知道这些方法是否真的存在任何“潜在”差异,或者如果我使用其中任何一个,是否有什么东西会在以后“咬”我#1 or #2或者它只是一个语法糖?
PS: 是的,我确实阅读了这里讨论 Python 和 pythonic 数据模型中的元类的其他线程。