python: создать класс с параметром
подскажите, можно ли в питоне сделать следующее:
создать некоторую функцию, которая в зависимости от параметра будет выдавать классы (некоторая фабрика), например:
def factory(v):
if v == 0:
return Class0
elif v == 1:
return Class1
else:
return ClassCustom
чтобы уже в дальнейшем использовать классы обычным способом
Class = factory(1)
value = Class('abc')
Так вот вопрос
можно ли создать класс, которому при создании указать некоторый параметр, который потом будут получать все экземпляры класса, т.е. что-то типа
else:
return ClassCustom(v)
и тогда
ClassOne = factory(1000)
ClassTwo = factory(2000)
co = ClassOne('abc')
ct = ClassTwo('xyz')
При этом фактически ClassOne и ClassTwo - это все один класс ClassCustom, но внутри каждого сидит свое значение переменной (к примеру) - 1000 и 2000 соответственно и у соответствующих экземпляров будет тоже самое -
co.v - 1000
ct.v - 2000
Как вариант вижу решение в виде лямбда оболочки
else:
return lambda arg: ClassCustom(v, arg)
Но не является ли это костылем, может можно сделать как-то более правильно?
Ответы (1 шт):
Поставленную вами задачу можно выполнить с помощью type. Это метакласс. Код может выглядеть вот так:
def some_func(self):
return self.x
def return_class():
return type("ClassName", (), {"x":5,"func":some_func})
my_class= return_class()
obj = my_class()
print(obj.x, obj.func(), type(obj))
Вывод
5 5 <class '__main__.ClassName'>
type принимает три аргумента на вход, название класса, tuple, где перечисляются наследники ( в примере он пуст), и словарь методов и атрибутов у будущего класса. При одном аргументе type возвращает тип переданного ей объекта.