Squeak.ru - шаблоны программирования

Правильно реализовать наследование методов во время создания класса

Как реализовать суперподобное поведение в методах, которые вызываются до того, как класс будет полностью построен. Могу ли я реализовать ряд взаимозависимых методов, подобных этому?

from six import with_metaclass

class Meta(type):
    """a metaclass"""

    def __init__(cls, name, bases, classdict):
        cls.setup_class()

    def setup_class(cls):
        pass


class A(with_metaclass(Meta, object)):
    """a class"""

    @classmethod
    def instantiate(cls, name):
        print("instantiating through '%s'" % name)

    @classmethod
    def setup_class(cls):
        cls.instantiate('A')


class B(A):

    @classmethod
    def setup_class(cls):
        super(B, cls).setup_class()
        cls.instantiate('B')

class C(B) pass

Очевидно, что это не может работать, поскольку B не существует должным образом, когда вызывается setup_class.


Ответы:


1

У меня был этот вопрос довольно давно, и я не мог найти сообщение, объясняющее этот аспект метаклассов. На самом деле он у меня был так долго, что я придумал это альтернативное и в конечном счете ненужное, решение . Технически он точно соответствует тому типу синтаксиса, который я хотел (что круто), но, в конце концов, это хак. Поскольку я потратил так много времени на создание бессмысленного (но все же крутого) фрагмента кода, я решил хотя бы попытаться убедиться, что никто больше не застрял в той же колее.

Мое замешательство на самом деле возникло из-за того, что я не до конца расширил свое понимание метаклассов и их отношений со своими классами до логического завершения. Так что, как оказалось, лучший способ создать тот тип наследования, который я хотел, состоял в том, чтобы фактически выполнить его внутри ряда метаклассов — по тем же причинам попытка унаследовать атрибуты через экземпляры класса не имеет смысла, это не имеет смысла. смысл делать экземпляры метакласса полиморфными:

from six import with_metaclass

class Meta(type):
    """a metaclass"""

    def __init__(cls, name, bases, classdict):
        print("Beginning '%s' setup" % name)
        cls.setup_class()
        print("Finished '%s' setup \n" % name)

    def setup_class(cls):
        cls.attribute = 0
        cls.instantiate('Meta')


class AMeta(Meta):

    def setup_class(cls):
        super(AMeta, cls).setup_class()
        cls.instantiate('A')

    def instantiate(cls, name):
        print("instantiating through '%s'" % name)

class A(with_metaclass(AMeta, object)): pass


class BMeta(AMeta):

    def setup_class(cls):
        super(BMeta, cls).setup_class()
        cls.instantiate('B')

class B(with_metaclass(BMeta, object)): pass


class C(B): pass

Если кто-то хочет более тщательно изучить это, я уверен, что кто-то там будет признателен.

26.05.2016
Новые материалы

Угловая структура архитектуры
Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

«Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

Создайте API с помощью Python FastAPI
Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

Веселье с прокси-сервером JavaScript
Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...