Python и фабрики

Darren, который работал бы, если бы типы были определенными перечислениями - для общих перечислений для работы, необходимо бросить их к ints (или более вероятно uint), чтобы сделать булеву математику:

public static bool IsSet( this Enum input, Enum matchTo )
{
    return ( Convert.ToUInt32( input ) & Convert.ToUInt32( matchTo ) ) != 0;
}
5
задан George Silva 30 October 2009 в 18:41
поделиться

4 ответа

Ваш код контрпродуктивен (извините, я должен это сказать).

Смысл фабрики в том, что вам не нужно знать класс созданного вами объекта в положение, в котором вы его создаете.

Причина в том, что создание объекта создает пробел в объектно-ориентированной абстракции. Вы должны быть конкретны в создании объекта. Но иногда вы просто хотите создать объект с некоторым поведением, но кто-то другой должен решить (централизованно), что это за конкретный класс.

Например, вы должны создать один вид объекта в 100 местах. Но позже вы можете узнать, что вы должны изменить класс - вам придется поменять все эти места.

Фабрика устранит эту необходимость, определив одно место, которое вы должны изменить.

Простейшей фабрикой будет :

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

Конечно, в некоторых ситуациях это может мало помочь. Таким образом, некоторые фабрики могут также загружать имена классов из базы данных или какой-либо другой конфигурации. Но самое простое решение - это жестко запрограммированная конструкция объекта - только этот метод должен быть изменен в нашем примере, когда вы решите всегда вызывать этот метод.

Несколько более динамичное решение (без необходимости в БД) :

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

myFactory = Factory(testClass)

Экземпляр myFactory можно использовать в разных местах для создания правильных экземпляров. Проблема в том, как инициализировать myFactory - в каком-то специальном модуле ??

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

myFactory = Factory(testClass)

Экземпляр myFactory может использоваться в разных местах для создания правильных экземпляров. Проблема в том, как инициализировать myFactory - в каком-то специальном модуле ??

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

myFactory = Factory(testClass)

Экземпляр myFactory может использоваться в разных местах для создания правильных экземпляров. Проблема в том, как инициализировать myFactory - в каком-то специальном модуле ??

13
ответ дан 18 December 2019 в 08:29
поделиться

Ваш метод изготовления должен выглядеть так:

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

apply () принимает список аргументов. Принимая * args в методе fabricateAnotherObject, вы используете все параметры, кроме obj, в виде списка, который можно передать в apply ().

0
ответ дан 18 December 2019 в 08:29
поделиться

Заводской шаблон предназначен для языков программирования, которые не позволяют использовать функции (и классы) в качестве значений первого порядка (например, C ++ или Java).

Идея состоит в том, что вы передаете экземпляр «фабричного» класса в качестве аргумента некоторой функции (или метода, или конструктора), который затем используется для создания новых экземпляров объекта (обычно это экземпляры некоторого конкретного подкласса суперкласса, который известен заранее).

В Python вы можете просто передать класс вместо этого (потому что классы (и функции) также являются объектами).

5
ответ дан 18 December 2019 в 08:29
поделиться

См. Также type () в docs.python.org/library/functions:[1278 visibletype(name, base, dict)

Возвращает объект нового типа. По сути, это динамическая форма оператора класса. Строка имени является именем класса и становится атрибутом __name__; базовый кортеж перечисляет базовые классы и становится атрибутом __bases__; а словарь dict - это пространство имен, содержащее определения для тела класса и становится атрибутом __dict__. Например, следующие два оператора создают объекты идентичного типа:

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

Краткую реальную программу с одним использованием фабрик (компактное построение множества специальных dicts) см. ofc2.py .
Эксперты, пожалуйста, еще примеры?

1
ответ дан 18 December 2019 в 08:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: