Darren, который работал бы, если бы типы были определенными перечислениями - для общих перечислений для работы, необходимо бросить их к ints (или более вероятно uint), чтобы сделать булеву математику:
public static bool IsSet( this Enum input, Enum matchTo )
{
return ( Convert.ToUInt32( input ) & Convert.ToUInt32( matchTo ) ) != 0;
}
Ваш код контрпродуктивен (извините, я должен это сказать).
Смысл фабрики в том, что вам не нужно знать класс созданного вами объекта в положение, в котором вы его создаете.
Причина в том, что создание объекта создает пробел в объектно-ориентированной абстракции. Вы должны быть конкретны в создании объекта. Но иногда вы просто хотите создать объект с некоторым поведением, но кто-то другой должен решить (централизованно), что это за конкретный класс.
Например, вы должны создать один вид объекта в 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 - в каком-то специальном модуле ??
Ваш метод изготовления должен выглядеть так:
def fabricateAnotherObject(self, obj, *args):
return apply(obj, args)
apply () принимает список аргументов. Принимая * args в методе fabricateAnotherObject, вы используете все параметры, кроме obj, в виде списка, который можно передать в apply ().
Заводской шаблон предназначен для языков программирования, которые не позволяют использовать функции (и классы) в качестве значений первого порядка (например, C ++ или Java).
Идея состоит в том, что вы передаете экземпляр «фабричного» класса в качестве аргумента некоторой функции (или метода, или конструктора), который затем используется для создания новых экземпляров объекта (обычно это экземпляры некоторого конкретного подкласса суперкласса, который известен заранее).
В Python вы можете просто передать класс вместо этого (потому что классы (и функции) также являются объектами).
См. Также 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 .
Эксперты, пожалуйста, еще примеры?