使用元类实现工厂设计模式
Posted
技术标签:
【中文标题】使用元类实现工厂设计模式【英文标题】:Implementing the factory design pattern using metaclasses 【发布时间】:2011-01-27 11:16:53 【问题描述】:我发现了很多关于元类的链接,其中大多数都提到它们对于实现工厂方法很有用。你能告诉我一个使用元类来实现设计模式的例子吗?
【问题讨论】:
接受的答案是否令人满意?我有点想找一些更详细的东西。 【参考方案1】:我很想听听人们对此的看法,但我认为这是你想做的一个例子
class FactoryMetaclassObject(type):
def __init__(cls, name, bases, attrs):
"""__init__ will happen when the metaclass is constructed:
the class object itself (not the instance of the class)"""
pass
def __call__(*args, **kw):
"""
__call__ will happen when an instance of the class (NOT metaclass)
is instantiated. For example, We can add instance methods here and they will
be added to the instance of our class and NOT as a class method
(aka: a method applied to our instance of object).
Or, if this metaclass is used as a factory, we can return a whole different
classes' instance
"""
return "hello world!"
class FactorWorker(object):
__metaclass__ = FactoryMetaclassObject
f = FactorWorker()
print f.__class__
你会看到的结果是:type 'str'
【讨论】:
您能否在示例中添加一点“工厂化”,即应用于创建的对象的一些自定义?【参考方案2】:您可以在wikibooks/python、here 和here 找到一些有用的示例
【讨论】:
这些正是我偶然发现的链接。我在其中任何一个中都找不到工厂的具体示例(尽管他们都提到了)...... 您的 O'Reilly 和 IBM 链接已过时。 (十年后并不奇怪!)请考虑刷新它们并发布一些内容。【参考方案3】:没必要。您可以override a class's __new__()
method 以返回完全不同的对象类型。
【讨论】:
我不认为你可以使用元类......(也许你可以 - 如果是这样,请告诉我,我会学到一些东西:)) @RyanWilcox:__new__()
可以返回任何东西。以上是关于使用元类实现工厂设计模式的主要内容,如果未能解决你的问题,请参考以下文章