相关疑难解决方法(0)

动态添加带或不带元类的方法

更新 - 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)

python metaclass

11
推荐指数
2
解决办法
3563
查看次数

标签 统计

metaclass ×1

python ×1