Python和工厂

时间:2009-10-30 18:41:06

标签: python oop factory

我似乎无法掌握工厂的正确概念。

任何人都可以帮我编写一个简单的测试代码吗?我通过互联网阅读了一些文本,并且无法用同样的方式编写代码。其实我无法理解这个过程。复制代码很简单,但我需要了解为什么这不起作用。

class Factory:

    def __init__(self):
        self.msg = "teste"

    def fabricateAnotherObject(self,obj,**kwargs):
        return apply(obj,**kwargs)

class testClass:
    def __init__(self,nome,salario,endereco):
        self.nome = nome
        self.salario = salario
        self.endereco = endereco

    def __str__(self):
        return "Nome: " + str(self.nome) + "\nEndereco: " + str(self.endereco) + "\nSalario: " + str(self.salario) 

a = Factory()
emp = a.fabricateAnotherObject(testClass,"George",2000,"Three Four Five Avenue")
print str(emp)

4 个答案:

答案 0 :(得分:13)

你的代码适得其反(对不起,我必须说出来)。

工厂的意义是,您不必在创建它的位置知道构造对象的类。

原因是,对象创建在面向对象的抽象中创造了一个空白。你必须具体创建对象。但有时你只想创建一个具有某种行为的对象,但是其他人应该(集中)决定它是什么具体的类。

例如,您必须在100个地方创建一种对象。但是后来你可能会发现,你必须改变课程 - 你必须改变所有这些地方。

工厂将通过定义您必须更改的一个地方来消除这种需求。

最简单的工厂是:

def fabricateAnotherObject(self, **kwargs):
    return testClass(**kwargs)

当然,在某些情况下这可能没什么帮助。因此,一些工厂也可能从db或其他配置加载类名。但最简单的解决方案是对象的硬编码构造 - 当您选择始终调用此方法时,只有在我们的示例中必须更改此方法。

更动态的解决方案(不需要db):

class Factory(object):
   def __init__(self, theClass):
       self.theClass = theClass
   def create(self, **kwargs):
       self.theClass(**kwargs)

myFactory = Factory(testClass)

可以在不同位置使用myFactory实例来创建正确的实例。问题是,如何初始化myFactory - 在某些特殊模块中?

答案 1 :(得分:5)

工厂模式适用于不允许函数(和类)作为一阶值(例如C ++或Java)的编程语言。

这个想法是你将一个“工厂”类的实例作为参数传递给某个函数(或方法或构造函数),然后用它来生成新的对象实例(通常这些是一些特定子类的实例)事先知道的超类。)

在Python中,你可以改为传递类(因为类(和函数)也是对象)。

答案 2 :(得分:0)

您的制作方法应如下所示:

    def fabricateAnotherObject(self, obj, *args):
        return apply(obj, args)

apply()接受一个args列表。通过在fabricateAnotherObject方法中引入* args,可以使用obj之外的所有参数作为可以传递给apply()的列表。

答案 3 :(得分:0)

另见type() 在docs.python.org/library/functions中:

类型(名称,基数,字典)

返回一个新类型对象。这实际上是类语句的动态形式。 名称字符串是类名,并成为__name__属性; 基元元组列出基类并成为__bases__属性; dict字典是包含类体定义的命名空间 并成为__dict__属性。 例如,以下两个语句创建相同的类型对象:

class X(object):
    a = 1
X = type('X', (object,), dict(a=1))

对于一个使用工厂的简短实际程序(紧凑地构建许多特殊的dicts),请参阅 ofc2.py
专家,更多例子吗?