Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 26, 2013 08:20:26

plusplus
От:
Зарегистрирован: 2009-01-05
Сообщения: 418
Репутация: +  15  -
Профиль   Отправить e-mail  

Подскажите по метаклассам.

Можно ли сделать так:

a = MyClass(5)
type(a) == 'BaseClass5'
a = MyClass(10)
type(a) == 'BaseClass10'

Ну то есть в зависимости от того, что я передаю в конструктор мне возвращается тот или иной класс.



Офлайн

#2 Дек. 26, 2013 08:36:28

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Подскажите по метаклассам.

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)

Офлайн

#3 Дек. 26, 2013 09:20:14

plusplus
От:
Зарегистрирован: 2009-01-05
Сообщения: 418
Репутация: +  15  -
Профиль   Отправить e-mail  

Подскажите по метаклассам.

Спасибо, понял, что фигней занимаюсь, просто сделать функцию да возвращать класс мне надо и не мудрить с метаклассами.



Офлайн

#4 Дек. 29, 2013 02:44:20

PanovSergey
От: Екатеринбург
Зарегистрирован: 2013-12-29
Сообщения: 269
Репутация: +  19  -
Профиль   Адрес электронной почты  

Подскажите по метаклассам.

С чего вы взяли что фигней занимаетесь как раз метаклассы это конструкторы классов. Сейчас некогда писать решение. Вечером если не забуду напишу.

Офлайн

#5 Дек. 29, 2013 08:16:24

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Подскажите по метаклассам.

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



Отредактировано FishHook (Янв. 9, 2014 04:33:37)

Офлайн

#6 Янв. 9, 2014 04:11:40

PanovSergey
От: Екатеринбург
Зарегистрирован: 2013-12-29
Сообщения: 269
Репутация: +  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()

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

Если написано что делать через метаклассы то это не просто так.

Офлайн

#7 Фев. 3, 2014 09:28:36

plusplus
От:
Зарегистрирован: 2009-01-05
Сообщения: 418
Репутация: +  15  -
Профиль   Отправить e-mail  

Подскажите по метаклассам.

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)
Сделал вот так, оцените плиз, пойдет или бред написан.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version