Цепочка методов/функций Python

В python можно ли объединить методы и функции класса вместе? Например, если я хочу создать экземпляр объекта класса и вызвать для него метод, который влияет на состояние переменной экземпляра, могу ли я это сделать? Вот пример:

class Test(object):
    def __init__(self):
        self.x = 'Hello'

    @classmethod
    def make_upper(y):
        y.x = y.x.upper()

Я хочу сделать следующее:

h = Test().make_upper()

Я хочу создать экземпляр объекта класса и повлиять на состояние переменной в одной строке кода, но я также хотел бы иметь возможность связывать вместе несколько функций, которые могут влиять на состояние или делать что-то еще с объектом. Возможно ли это в python, как в jQuery?


person Jasonca1    schedule 04.07.2018    source источник
comment
Если каждый вызываемый вами метод возвращает объект, предоставляющий следующий метод, который вы хотите вызвать, он будет работать. Если они этого не сделают, это не будет. Это зависит от того, как написаны ваши методы.   -  person khelwood    schedule 04.07.2018
comment
Если все ваши методы возвращают себя, конечно   -  person Mad Physicist    schedule 04.07.2018
comment
Как правило, это не очень хороший дизайн, но если он работает для вас, он работает для вас.   -  person Mad Physicist    schedule 04.07.2018
comment
Кроме того, вы, вероятно, не хотите, чтобы make_upper был методом класса.   -  person Mad Physicist    schedule 04.07.2018


Ответы (2)


Да, конечно. Просто верните self из интересующих вас методов экземпляра:

class Test(object):
    def __init__(self):
        self.x = 'Hello'

    def make_upper(self):
        self.x = self.x.upper()
        return self
    def make_lower(self):
        self.x = self.x.lower()
        return self

h = Test().make_upper()
print(h.x)

Выход:

HELLO
person quamrana    schedule 04.07.2018

Да и нет. Цепочка, безусловно, работает, но h является возвращаемым значением make_upper(), а не объектом, возвращаемым Test(). Вам нужно написать это двумя строками.

h = Test()
h.make_upper()

Однако недавно был принят PEP-572. для включения в Python 3.8, а это значит, что когда-нибудь вы могли бы написать

(h := Test()).make_upper()

Возвращаемое значение Test() присваивается h в текущей области и используется в качестве значения выражения :=, которое затем вызывает свой метод make_upper. Однако я не уверен, что рекомендовал бы использовать := в этом случае; требуемый в настоящее время синтаксис намного более удобочитаем.

person chepner    schedule 04.07.2018