或者一切都是方法吗?
因为一切都是对象,所以
def whatever:
只是该文件的一种方法,对吧?
答案 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”作为文件命名空间中的普通函数。