Python中有函数,还是一切都是方法?

时间:2009-11-30 11:55:51

标签: python function oop methods

或者一切都是方法吗?

因为一切都是对象,所以

def whatever:

只是该文件的一种方法,对吧?

3 个答案:

答案 0 :(得分:31)

Python有功能。因为一切都是对象functions are objects too

所以,使用你的例子:

>>> def whatever():
...     pass
...
>>> whatever
<function whatever at 0x00AF5F30>

当我们使用def时,我们创建了一个函数对象。例如,我们可以查看对象的属性:

>>> whatever.func_name
'whatever'

在回答您的问题时,whatever() <{1>}的方法。最好将它视为绑定到file.py全局命名空间中名称whatever的函数对象。

file.py

或者从另一个角度来看,没有什么可以阻止我们将名称>>> globals() {'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__d oc__': None, 'whatever': <function whatever at 0x00AF5EB0>} 完全绑定到另一个对象:

whatever

还有其他方法可以创建函数对象。例如,lambdas

>>> whatever
<function whatever at 0x00AF5F30>
>>> whatever = "string"
>>> whatever
'string'

方法就像是作为函数的对象的属性。使它成为方法的方法是将方法绑定到对象。这会导致对象作为我们通常称为>>> somelambda = lambda x: x * 2 >>> somelambda <function <lambda> at 0x00AF5F30> 的第一个参数传递给函数。

让我们使用方法self和实例SomeClass定义一个类somemethod

someobject

让我们将>>> class SomeClass: ... def somemethod(one="Not Passed", two="Not passed"): ... print "one = %s\ntwo = %s" % (one,two) ... >>> someobject = SomeClass() 视为属性:

somemethod

我们可以看到它是对象的绑定方法和类上的未绑定方法。现在让我们调用方法,看看会发生什么:

>>> SomeClass.somemethod
<unbound method SomeClass.somemethod>
>>> someobject.somemethod
<bound method SomeClass.somemethod of <__main__.SomeClass instance at 0x00AFE030

由于它是绑定方法,>>> someobject.somemethod("Hello world") one = <__main__.SomeClass instance at 0x00AFE030> two = Hello world 收到的第一个参数是对象,第二个参数是方法调用中的第一个参数。我们在课堂上调用方法:

somemethod

Python抱怨因为我们试图调用该方法而不给它一个适当类型的对象。所以我们可以通过“手动”传递对象来解决这个问题:

>>> SomeClass.somemethod("Hello world")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unbound method somemethod() must be called with SomeClass instance as first argument (got str instance instead)

您可以使用此类型的方法调用 - 在类上调用方法 - 当您想从超类调用特定方法时。

(有可能take a function and bind it to class to make it a method,但这不是您通常需要做的事情。)

答案 1 :(得分:2)

与Python中的Java不同,名为file.py的文件不一定包含一个名为file的类,如果这是一个名为file.java的java文件,您可能会想到它。

在Python中,文件是一个实际上只是命名空间的模块(更像是Java包而不是Java类),而不是类。请考虑以下示例file.py

def whatever_func():
    print "What ever function"

class SomeClass(object):
    def whatever_meth(self):
        print "What ever method"

在上面的示例中,file模块/命名空间包含一个名为whatever_func的普通函数和一个具有方法SomeClass的类whatever_meth

答案 2 :(得分:0)

嗯......您可以使用“whatever”作为文件命名空间中的普通函数。

相关问题