Форум сайта python.su
15
Можно ли сделать так:
a = MyClass(5) type(a) == 'BaseClass5' a = MyClass(10) type(a) == 'BaseClass10'
Офлайн
568
class BaseClass1(object): a = 1 class BaseClass2(object): a = 2 def Fabric(num, *args, **kwargs): base = globals()["BaseClass%s" % num] return type("BaseClass%s" % num, (base,), {})(*args, **kwargs) a = Fabric(2) print a.a
Отредактировано FishHook (Дек. 26, 2013 08:40:38)
Офлайн
15
Спасибо, понял, что фигней занимаюсь, просто сделать функцию да возвращать класс мне надо и не мудрить с метаклассами.
Офлайн
19
С чего вы взяли что фигней занимаетесь как раз метаклассы это конструкторы классов. Сейчас некогда писать решение. Вечером если не забуду напишу.
Офлайн
568
PanovSergeyИменно фигней занимается коллега plusplus, и Вы его провоцируете. class ИмяКласса(ЧтоТоВСкобках) в рамках синтаксиса питона однозначно трактуется, как наследование ИмяКласса от ЧтоТоВСкобках, а строка a = MyClass(ЧтоТоВСкобках) так же однозначно понимается, как вызов функции MyClass или инициализация класса. Если Вы сейчас собираетесь извернуть какой-нибудь хитрожопый способ достичь целей автора, то я попрошу не забывать, что всё уже давно придумано и ѧковебратеебилежѧ
С чего вы взяли что фигней занимаетесь как раз метаклассы это конструкторы классов. Сейчас некогда писать решение. Вечером если не забуду напишу.
Отредактировано FishHook (Янв. 9, 2014 04:33:37)
Офлайн
19
class BaseMetaClass(type): def __new__(mcs, name, bases, attrs): new_cls = type(attrs['name'], bases, attrs) return new_cls class Base(object): __metaclass__ = BaseMetaClass name = "NewBase" print Base()
Офлайн
15
class make_object(object): def __new__(cls, param1, param2): cls.param1 = param1 cls.param2 = param2 cls.type_ = cls.define_type() return cls.define_object()() @classmethod def define_object(cls): attrs = {'param1': param1, 'param2': param2, 'type_': cls.type_} if cls.type_ == 'Class1': return type("Class1", (Class1, ), attrs) elif cls.type_ == 'Class2': return type("Class2", (Class2, ), attrs) else: return type("UnknownClass", (UnknownClass, ), attrs)
Офлайн