当前位置:  开发笔记 > 编程语言 > 正文

Python和工厂

如何解决《Python和工厂》经验,为你挑选了2个好方法。

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

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

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)

Juergen.. 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> Juergen..:

你的代码适得其反(抱歉,我必须说出来).

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

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

例如,您必须在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 - 在一些特殊模块中?


类对象是Python中的一等公民.这意味着您不需要创建一个特殊的工厂,您可以直接传递类对象,例如,与传递整数或字符串的方式完全相同.

2> 小智..:

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

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

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

推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有