LINUX.ORG.RU

Как вызвать функцию из функции, которая в классе?

 ,


0

2

Добрый день. Интересует, можно ли сделать следующее? Допустим у меня есть класс Class, в нём функция function1, а в ней - функция function2. Могу ли я при импорте класса вызвать function2 без вызова функции function1? Или эту функцию нужно returnить?

class Class():
  def __init__(self):
    print('Hi!')
  def function1(self):
    def function2():
      print('Hello!')

Хочу сделать так -

my_class = Class()
my_class.function1().function2()

Нужно возвращать. Зона видимости вложенной функции такая же, как у переменной => снаружи не видна.

lu4nik ★★★
()

Или эту функцию нужно returnить?

this

true_admin ★★★★★
()

Понятно, всем спасибо. Закрываю тред.

mahalaka ★★
() автор топика

Хм, как мне получить такой синтаксис, допустим, если у меня несколько функций в функции function1?

my_class.function1().function2()

Или такой:

my_class.function1.function2()

?

Пока придумал только такое:

class Class():
  def __init__(self):
    print('Hi!')
  def function1(self):
    def function2():
      print('Hello!')
    def function3()
      print('blabla!')
    return {'function2': function2, 
            'function3': function3}

class = Class()
whatever = Class.function1()
whatever['function2']()
whatever['function3']()
mahalaka ★★
() автор топика
Ответ на: комментарий от mahalaka

Хм, как мне получить такой синтаксис, допустим, если у меня несколько функций в функции function1?

Ну так в function 1 возвращай объект, в котором определены функции 2 и 3.

Vovka-Korovka ★★★★★
()
Ответ на: комментарий от mahalaka

У тебя function1 как-то по-особому генерирует function2 и function3, или нужна только для того чтобы «получить такой синтаксис»? Если второе (пока похоже на то), то тебе function1 вообще не нужна, можешь использовать там объект. Если первое, но синтаксис нужен такой, то пусть function1 возвращает объект вместо словаря. Задача-то этих махинаций какая? Посильнее запутать код?

Psych218 ★★★★★
()
Последнее исправление: Psych218 (всего исправлений: 1)

Могу ли я при импорте класса вызвать function2 без вызова функции function1

Можешь.

class Test:
    def fun1(self):
        def fun2():
            print("Hello")

a = Test()
fun2_co = a.fun1.__code__.co_consts[1]  # .__code__.co_consts is a tuple of fun1 local objects
exec(fun2_co)

# OR

fun2 = lambda: exec(fun2_co)
fun2()
anonymous
()
Ответ на: комментарий от Psych218

Нет, мне нужна некая структуризация - есть класс, который используется для общения с одним сервисом, в нём есть функция смены статуса. И я хочу реализовать что-то типа service.change_status.active()

mahalaka ★★
() автор топика
Ответ на: комментарий от mahalaka

И я хочу реализовать что-то типа service.change_status.active()

А почему не service.change_status(«active»), что было бы логичнее? (Вместо строки можно использовать и константу ACTIVE, суть не в этом).

Просто у тебя получается (даже синтактически), что change_status — это не функция, функция — active(). А change_status — некий объект, который этот набор функций хранит. Это (то, что ты хочешь, судя по желаемому синтаксису) делается так. Просто создай ещё один класс StatusChanger с этими функциями в нём. Но это довольно странно выглядит, непривычный вид API. Change по сути не является методом, а имя говорит обратное, а active, слово, которое «интуитивно» воспринимается не как метод, а как состояние, как раз является функцией. Всё наоборот. change_status можно сделать функцией, возвращающей объект с методами active() и остальными, конечно. Но тогда будет не как ты написал, а service.change_status().active()

Всё же гораздо логичнее будет, если change_status у тебя будет как раз функцией, которая в качестве аргументов принимает статусы, то есть service.change_status(active). Такой код гораздо понятнее и привычнее. Вот она функция, и вот она принимает аргумент. Ну статусами могут быть тоже функции, если хочется (ты можешь сделать active функцией) тогда change_status будет выполнять свой какой-то код и вызывать ещё одну функцию, но такой вид смотрится явно логичнее, чем service.change_status.active()

Просто когда кто-то, кто пользуется этим твоим классом, видит имя change_status, он наверняка предположит, что это функция, которая меняет статус. И всё. Не возвращает функцию, а меняет. Она же change_status, а не get_status_change_functions какая-нибудь. Логично предположить, что она выполняет смену статуса и возвращает успешность сего действа, или ничего, или сам статус, но никак не функцию, которая на самом деле меняет статус, но называется словом active, то есть именем статуса. Ты просто делаешь лишнюю сущность там, где она не нужна. По сути просто излишнее запутывание кода, ничего больше.

Psych218 ★★★★★
()
Последнее исправление: Psych218 (всего исправлений: 2)
Ответ на: комментарий от Psych218

Да, наверное так будет правильней, у меня мало опыта в проектировании таких штук, ещё надо поразмыслить. Спасибо.

mahalaka ★★
() автор топика
Ответ на: комментарий от mahalaka

Как в jQuery же!

class C1(object):
  def __init__(self):
    class C2(object):
      def function2(self):
        print ('I\'m function2')
    self.c2 = C2()
  def function1(self):
     print ('I\'m function1')
     return self.c2
>>> C1().function1().function2()
I'm function1
I'm function2
irr123
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.