Python - @classmethod вести себя как @property - PullRequest
0 голосов
/ 18 июня 2020

Я делаю класс с цепными методами, проблема в том, что есть некоторые методы с *args параметрами, эти параметры могут получать объекты того же класса.

class A(object):
    def __init__(self, x=''):
        self.x = ''

    @property
    def tab(self):
        self.x = '\t'
        return self

    def concat(self, *args):
        self.x += ''.join(str(a) for a in args)
        return self

    def surround(self, *args):
        args = tuple(['('] + list(args) + [')'])
        return self.concat(*args)

    def __str__(self):
        return self.x

Нет проблем с этим , вы можете сделать:

obj = A()
obj2 = obj.tab.surround('x', 'y')
print str(obj2)

output: \t(xy)

Но если я хочу передать метод tab методу surround, это должно быть:

obj = A()
obj2 = obj.tab.surround(A().tab, 'x', 'y')

Есть ли способ вызвать метод tab без создания экземпляра объекта? Я имею в виду, что-то вроде этого:

obj = A()
obj2 = obj.tab.surround(A.tab, 'x', 'y')  # Note the lack of parenthesis.

Я искал ответы, составляющие что-то вроде @classmethod + @property, но ни один из них не решил мою проблему. Приветствуется решение для python 2.x и 3.x, потому что я хочу сделать его совместимым с обеими версиями, но также приветствуется решение только для 1 версии.

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