【问题标题】:Are there functions in Python, or is everything a method?Python中有函数,还是一切都是方法?
【发布时间】:2010-12-21 14:53:25
【问题描述】:

或者说一切都是方法?

既然一切都是对象,那么一个

def whatever:

只是那个file.py的一个方法,对吧?

【问题讨论】:

  • 我认为函数和方法是同义词。
  • @Amarghosh:不。方法是绑定到类的描述符。
  • 我相信的语言因语言而异 - 在 java 中,一切都是方法 - 静态或实例。
  • Java 在这方面有点不寻常,因为它缺少不是方法的函数。 (即,未绑定到类的函数。)
  • +1 好问题,它涉及 Python 的基础和深度主题。

标签: python function oop methods


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    Python 有函数。因为一切都是对象functions are objects too

    所以,用你的例子:

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

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

    >>> whatever.func_name
    'whatever'
    

    回答您的问题 - whatever() 不是 file.py方法。最好将其视为在file.py 的全局命名空间中绑定到名称whatever 的函数对象。

    >>> globals()
    {'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__d
    oc__': None, 'whatever': <function whatever at 0x00AF5EB0>}
    

    或者换个角度来看,没有什么能阻止我们将名称 whatever 完全绑定到不同的对象:

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

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

    >>> 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 收到的第一个参数是对象,第二个参数是方法调用中的第一个参数。让我们在类上调用方法:

    >>> 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)
    

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

    >>> SomeClass.somemethod(someobject,"Hello world")
    one = <__main__.SomeClass instance at 0x00AFE030>
    two = Hello world
    

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

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

    【讨论】:

      【解决方案3】:

      与 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

      【讨论】:

        猜你喜欢
        • 2012-03-24
        • 1970-01-01
        • 2012-02-22
        • 2013-01-24
        • 2020-11-22
        • 1970-01-01
        • 2010-12-31
        • 2015-06-15
        • 1970-01-01
        相关资源
        最近更新 更多