Tag: метакласс

Является ли тип по умолчанию .__ call__ больше, чем вызов __new__ и __init__?

Я пишу метакласс, и мне нужен дополнительный метод между __new__ и __init__. Если я вызывал метод до __new__ или после __init__, я мог бы написать, например, class Meta(type): def __call__(cls): ret = type.__call__() ret.extraMethod() Мое соблазн – написать class Meta(type): def __call__(cls): ret = cls.__new__(cls) ret.extraMethod() ret.__init__() return ret и просто воспроизвести функциональность типа .__ […]

TypeError: object .__ new __ (int) небезопасно, используйте int .__ new __ ()

Читая это: что такое метакласс в Python? , Я научился использовать __new__ используя следующий фрагмент: – class a(object): pass a.__new__(int,'abcdef',(int,),{}) __new__ возникнуть проблема при вызове __new__ с a. , Но, я получаю следующую ошибку, смысл которой я не понимаю: – TypeError: object.__new__(int) is not safe, use int.__new__() Если что-то связано с использованием __new__ , я […]

Наследование метакласса

В этом хорошо известном ответе, который объясняет метакласс в Python. Он упоминает, что атрибут __metaclass__ не будет унаследован. Но на самом деле я попытался в Python: class Meta1(type): def __new__(cls, clsname, bases, dct): print "Using Meta1" return type.__new__(cls, clsname, bases, dct) # "Using Meta1" printed class Foo1: __metaclass__ = Meta1 # "Using Meta1" printed class […]

Что такое способ «метакласса»?

Я хочу написать программу, которая принимает в качестве входного числа число p и выдает в качестве вывода конструктор типа для числа, которое подчиняется целочисленной арифметике по модулю p. До сих пор def IntegersModP(p): N = type('IntegersMod%d' % p, (), {}) def __init__(self, x): self.val = x % p def __add__(a, b): return N(a.val + b.val) […]

Конфликт метакласса, множественное наследование и экземпляр в качестве родительского

Я возился с темными искусствами Python, и мне хотелось бы помочь понять. Учитывая класс Foo , вот некоторые способы, которые я попытался унаследовать от него: class A(Foo) – работает, неудивительно class B(Foo()) – работает, если Foo имеет соответствующий метод __new__ (который я предоставил) class C(Foo(), Foo) – работает при тех же условиях, что и B […]

Проблема наследования Python __metaclass__

Моя проблема в том, что я использую метакласс для переноса определенных методов класса в таймер для ведения журнала. Например: class MyMeta(type): @staticmethod def time_method(method): def __wrapper(self, *args, **kwargs): start = time.time() result = method(self, *args, **kwargs) finish = time.time() sys.stdout.write('instancemethod %s took %0.3f s.\n' %( method.__name__, (finish – start))) return result return __wrapper def __new__(cls, […]

проблема наследования метакласса python

У меня есть несколько странный вопрос о метаклассе. Я использую метакласс для динамического создания класса «sibling», который наследуется от другого суперкласса и назначает его как атрибут исходного класса. Ниже приведена минимальная настройка: class Meta(type): def __new__(cls, name, parents, dct): sdct = dct.copy() dct['sibling'] = type(name+'Sibling', (Mom,), sdct) return super().__new__(cls, name, (Dad,), dct) class Mom: def […]

Автоматическое присвоение класса (или проверка) при выводе

У меня есть базовый класс, из которого я получаю несколько подклассов. Каждый подкласс определяет константы класса, и я хочу применить к ним определенные ограничения. Например: class Base(object): # define these in your sub-class, and make sure (NOM % DENOM == 0) NOMINATOR = None DENOMINATOR = None class Subclass_good(Base): NOMINATOR = 6 DENOMINATOR = 3 […]

Ограничение типа атрибута с помощью метакласса

Я пытаюсь войти в программирование метакласса в Python, и я хотел бы знать, как ограничить тип атрибута метаклассом. С дескрипторами это довольно просто, но как насчет метаклассов? Вот краткий пример: >>> class Image(Object): … height = 0 … width = 0 … path = '/tmp' … size = 0 >>> img = Image() >>> img.height […]

Python: метакласс + обернутые методы + наследование = проблемы

У меня проблема в Python, для которой я не могу найти никакого чистого решения … При вызове некоторых методов я хочу выполнить некоторый код перед выполнением метода и после него. Чтобы (среди многих других) автоматически устанавливать и очищать переменную context . Чтобы достичь этого, я объявил следующий метакласс: class MyType(type): def __new__(cls, name, bases, attrs): […]

Python - лучший язык программирования в мире.