Python 3: класс «шаблон» (функция, которая возвращает параметризованный класс) - PullRequest
15 голосов
/ 01 февраля 2011

Я пытаюсь создать функцию, которая передает параметр x и возвращает новый класс C.C должен быть подклассом фиксированного базового класса A только с одним добавлением: добавляется определенный атрибут класса и устанавливается равным x.

Другими словами:

class C(A):
  C.p = x # x is the parameter passed to the factory function

Это легко сделать?Есть ли какие-либо проблемы, о которых я должен знать?

Ответы [ 2 ]

14 голосов
/ 01 февраля 2011

Прежде всего, обратите внимание, что термин "фабрика классов" в Python несколько устарел.Он используется в таких языках, как C ++, для функции, которая возвращает динамически типизированный экземпляр класса.У него есть имя, потому что оно выделяется в C ++;это не редкость, но достаточно редко, когда полезно дать шаблону имя.В Python, однако, это делается постоянно - это такая базовая операция, что никто не удосуживается дать ей специальное имя.

Также обратите внимание, что фабрика классов возвращает экземпляры класса, а не сам класс,(Опять же, это потому, что это из языков, таких как C ++, которые не имеют понятия о возврате объектов только для класса.) Однако вы сказали, что хотите вернуть «новый класс», а не новый экземпляр класса.

Создать локальный класс и вернуть его тривиально:

def make_class(x):
    class C(A):
        p = x
    return C
8 голосов
/ 01 февраля 2011

Функция type имеет версию с тремя аргументами, которая динамически создает новый класс. Передайте имя , base и dict , содержащие атрибуты и методы класса.

В вашем случае:

def class_factory(x):
    return type("C", (A,), {"p": x})

Очевидно, что вы можете динамически устанавливать имя класса "C", но учтите, что для того, чтобы сделать класс общедоступным, вам также необходимо присвоить результат функции переменной. Вы можете сделать это динамически, используя globals()["C"] = ..., или назначить классы словарю, что угодно.

...