方法可以在Python中使用方法吗?

时间:2012-02-17 19:49:12

标签: python object methods

这看起来有点奇怪,但它会让我方便地完成一些代码。

因为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 个答案:

答案 0 :(得分:6)

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"

答案 1 :(得分:4)

是和否。显然,他们可以拥有分配给他们的属性,这些属性与方法类似。此外,函数附带已经附加的方法 - 例如,使用函数调用的__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!"