Могут ли методы иметь методы в Python? - PullRequest
4 голосов
/ 17 февраля 2012

это может показаться немного странным, но для меня это был бы удобный способ закончить немного кода.

Поскольку методы Python сами являются объектами, может ли метод иметь собственный метод? То есть, если бы я хотел сделать следующее (игнорируя синтаксис):

def methodCaller(someArgs, methodB):
    # some stuff here . . .
    variableWithAGoodName = methodB()
    jonSkeet = methodB.methodC(variableWithAGoodName)
    return jonSkeet

Возможно ли это? Я думаю, нет, но если методы - это просто объекты, разве это не должно быть как-то возможно?

Большое спасибо!

РЕДАКТИРОВАТЬ: Я думаю, как было опубликовано, я ищу функцию высокого порядка.

Мой вопрос несколько академический, так как я знаю, что мог бы реорганизовать свой код, чтобы сделать это совершенно иначе. Но на самом деле я экспериментирую с Python, чтобы изучить хотя бы его основы. Я еще не пробовал, но, поскольку я незнаком с Python, это возможно, но только не с этим синтаксисом.

Еще одно РЕДАКТИРОВАНИЕ: я пытался быть смешным с моим наименованием, но это сделало вопрос неясным. За что я прошу прощения. Вот лучший пример:

def MethodA(MethodB):
    # MethodB is passed as a parameter but is also a method.
    # MethodB has a method of its own, somehow, because it is technically still
    # an object.
    MethodB.MethodC() #Let's pretend it returns nothing here.
    # Can this happen?

Ответы [ 2 ]

6 голосов
/ 17 февраля 2012

Функции в python являются первоклассными объектами с методами и атрибутами.

def foo():
    print("foo")

def bar():
    print("bar")

foo.bar = bar
foo.bar()                  #outputs "bar"

foo.baz = "Hello, world!"
print(foo.baz)             # outputs "Hello, World!"

Редактировать:

Поскольку функции являются объектами первого класса, вы также можетепередать их, как и любую другую переменную.Вы также можете написать «функции высшего порядка», которые являются функциями функций (или функций, возвращающих функции.)

Редактировать 2:

[Комумелодия «Нет такой вечеринки, как вечеринка S-Club!»] Нет такого примера, как пример с полным кодом!

def higher_order_function (input_function):
    input_function.method()

def input_function_1 ():
    print ("exec'ing input_function_1()")

def input_function_1_method ():
    print ("exec'ing input_function_1_method()")

input_function_1.method = input_function_1_method

higher_order_function(input_function_1)
# prints "exec'ing input_function_1_method"
4 голосов
/ 18 февраля 2012

Да и нет.Очевидно, что им могут быть назначены атрибуты, которые работают аналогично методам.Кроме того, функции поставляются с уже прикрепленными методами - например, метод __call__, который вызывается с функцией.

Однако, чтобы добавить метод к объекту, что бы вы обычно делали?Подкласс класса объекта и добавьте метод.Однако, если вы попытаетесь создать подкласс для функции

imports types
class F(types.FunctionType):
    pass

, вы получите эту ошибку

type 'function' is not an acceptable base type

Если вы хотите создать «вызываемый» объект, который может иметь методы и использовать наследование, попробуйте что-то вроде этого.

class MyCallable(object):
    def __init__(self):
        self.message = "Look ma, I got called!"

    def __call__(self, *args, **kwargs):
        self.print_message()

    def print_message(self):
        print(self.message)


class CallableChild(object):
    def __call__(self, *args, **kwargs):
        super(CallableChild, self).__call__(*args, **kwargs)
        print "...as a child, too!"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...