Каков наилучший питонический способ обертывания объекта? - PullRequest
2 голосов
/ 11 мая 2011

Я хотел бы иметь возможность обернуть любой объект в Python. Следующее не представляется возможным, вы знаете, почему?

class Wrapper:
    def wrap(self, obj):
        self = obj

a = list()
b = Wrapper().wrap(a)
# can't do b.append

Спасибо!

Ответы [ 4 ]

5 голосов
/ 11 мая 2011

Попробуйте использовать магию Python getattr:

class Wrapper:
    def wrap(self, obj):
        self.obj = obj
    def __getattr__(self, name):
        return getattr(self.obj, name)

a = list()
b = Wrapper()
b.wrap(a)

b.append(10)
1 голос
/ 11 мая 2011

Возможно, то, что вы ищете, что делает работу, которую вы ищете, гораздо более элегантно, чем вы пытаетесь это сделать, это:

Алекс Мартелли Bunch Class .

class Bunch:
    def __init__(self, **kwds):
    self.__dict__.update(kwds)

# that's it!  Now, you can create a Bunch
# whenever you want to group a few variables:

point = Bunch(datum=y, squared=y*y, coord=x)

# and of course you can read/write the named
# attributes you just created, add others, del
# some of them, etc, etc:
if point.squared > threshold:
    point.isok = 1

На связанной странице рецептов доступны альтернативные реализации.

0 голосов
/ 11 мая 2011

Вы также можете делать то, что хотите, переопределив новое:

class Wrapper(object):
    def __new__(cls, obj):
        return obj
t = Wrapper(list())
t.append(5)
0 голосов
/ 11 мая 2011

Вы просто ссылаетесь на переменную self как определенный объект в wrap ().Когда wrap () заканчивается, эта переменная собирается как мусор.

Вы можете просто сохранить объект в атрибуте Wrapper, чтобы получить то, что вы хотите

...