2016-09-06 2 views
0

Какова цель подкласса экземпляра класса в Python? Вот пример:Какова цель использования экземпляра класса в качестве супер/базового класса?

class A: 
    def __init__(*args): print(args) 

base = A() 


class Test(base): pass 

Этот код работает нормально в Python, но base является экземпляром класса A (1) Почему мы должны создать подкласс экземпляра класса?Связано это с метаклассами?

С этого вопроса: What happens when you inherent from a module instead of a class in Python?

Я понимаю, что Test(base) станет type(base).__init__ (2) это происходит во время определения, когда определяется класс? (3) Как Python знает/принимает решение о том, что base является экземпляром класса? Это потому, что type(base) не возвращается type?

+3

У вас есть фактический код производственного кода, который делает это или это просто любопытство? –

+0

Любопытство и желание сделать рациональное мышление о функции :-) – direprobs

+1

И нет, 'Test (base)' не становится 'типом (базой) .__ init__'. Он становится 'type (base) .__ new__', который, в свою очередь, может называть' __init__'. И да, это из-за метаклассов. –

ответ

1

Python фактически использует type(base)(classname, bases, body) для создания объекта класса. Это обычный вызов метакласса (если только класс не указывает конкретный метакласс).

Для экземпляра (или модуль, который в основном является экземпляром тоже), это означает, что класс __new__ статический метод вызывается для получения нового экземпляра, и на этом новом экземпляре __init__ называется. Поэтому для вашего синтаксиса class Test(base): pass вы по существу создаете новый экземпляр A, когда Python выполняет оператор class.

Это еще не "определение времени"; такой код не существует в коде Python. Python загружает байт-код для модуля и выполняет его, когда он импортируется в первый раз. В это время выполняются инструкции класса в верхней части модуля (а не внутри функций). В это время тогда выполняется вызов type(base)(...), да.

Python не знает или не принимает решения о базовом классе. Философия Python - доверять разработчику, который пишет код в нем. Предполагается, что вы знаете, что делаете, и базовые классы просто обрабатываются так, как будто они будут правильно реагировать. Поскольку type(base)(....) не вызывал исключения, Python просто продолжался.

Вы можете использовать все, что можно назвать метаклассом.