Можно ли создать класс, который представляет другой тип в Python, при прямой ссылке? - PullRequest
1 голос
/ 31 марта 2009

Так что, если у меня есть класс, как:

CustomVal

Я хочу иметь возможность представлять буквальное значение, так же, как установить его в конструкторе:

val = CustomVal ( 5 )

val.SomeDefaultIntMethod

По сути, я хочу, чтобы CustomVal представлял все, что указано в конструкторе.

Я не говорю о пользовательских методах, которые знают, как обращаться с CustomVal, а скорее о том, чтобы сделать его другим необходимым мне значением.

Возможно ли это?

Кстати, 5 является лишь примером, в действительности это пользовательский тип COM, который я хочу легко скопировать.

Поэтому, ссылаясь на CustomVal, я получу доступ к функциональности, связанной с int (для 5), или к функциональности объекта, который я хочу представить (для COM).

Так что, если COM-объект - RasterizedImage, я получу доступ к его методам напрямую:

CustomVal.Raster () ...

РЕДАКТИРОВАТЬ: Это то, что я имею в виду: я не хочу получить доступ как атрибут, но сам объект:

CustomVal

вместо:

CustomVal.SomeAttribute

Причина, по которой я этого хочу, заключается в том, что COM-объект слишком вовлечен для инициализации, и при этом он будет выглядеть как оригинальная внутренняя реализация, которую предлагает приложение.

Ответы [ 2 ]

7 голосов
/ 31 марта 2009

Обычный способ обернуть объект в Python - переопределить __getattr__ в вашем классе:

class CustomVal(object):
    def __init__(self, value):
        self.value = value

    def __getattr__(self, attr):
        return getattr(self.value, attr)

Итак, вы можете сделать

>>> obj = CustomVal(wrapped_obj)
>>> obj.SomeAttributeOfWrappedObj

Вы также можете переопределить __setattr__ и __delattr__, чтобы включить установку и удаление атрибутов соответственно (см. документация по библиотеке Python ).

2 голосов
/ 31 марта 2009

Возможно, вы просто переосмыслили это ... Вы можете поместить все, что захотите, в свой val, а затем вызвать любой метод объекта, который вам нужен:

>>> val = ThingaMoBob(123, {p:3.14}, flag=False)
>>> val.SomeCrazyMathod()

Я что-то упустил?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...