Найти - Пользователи
Полная версия: Подскажите по метаклассам.
Начало » Python для новичков » Подскажите по метаклассам.
1
plusplus
Можно ли сделать так:
a = MyClass(5)
type(a) == 'BaseClass5'
a = MyClass(10)
type(a) == 'BaseClass10'

Ну то есть в зависимости от того, что я передаю в конструктор мне возвращается тот или иной класс.
FishHook
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
plusplus
Спасибо, понял, что фигней занимаюсь, просто сделать функцию да возвращать класс мне надо и не мудрить с метаклассами.
PanovSergey
С чего вы взяли что фигней занимаетесь как раз метаклассы это конструкторы классов. Сейчас некогда писать решение. Вечером если не забуду напишу.
FishHook
PanovSergey
С чего вы взяли что фигней занимаетесь как раз метаклассы это конструкторы классов. Сейчас некогда писать решение. Вечером если не забуду напишу.
Именно фигней занимается коллега plusplus, и Вы его провоцируете. class ИмяКласса(ЧтоТоВСкобках) в рамках синтаксиса питона однозначно трактуется, как наследование ИмяКласса от ЧтоТоВСкобках, а строка a = MyClass(ЧтоТоВСкобках) так же однозначно понимается, как вызов функции MyClass или инициализация класса. Если Вы сейчас собираетесь извернуть какой-нибудь хитрожопый способ достичь целей автора, то я попрошу не забывать, что всё уже давно придумано и ѧковебратеебилежѧ
PanovSergey
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()

Читаем раздел “Why the hell would you use metaclasses?”

Если написано что делать через метаклассы то это не просто так.
plusplus
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)
Сделал вот так, оцените плиз, пойдет или бред написан.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB