当前位置: 首页 > 面试题库 >

方法对象vs函数对象,Python类实例vs类

秋光熙
2023-03-14
问题内容

我正在尝试验证实例属性和类属性之间的区别,该区别由2012年11月1日发布的Python教程2.7.3版第9章:类,第66页最后一行(

):

实例对象的有效方法名称取决于其类。根据定义,作为函数对象的类的所有属性都定义了其实例的相应方法。因此,在我们的示例中,xf是有效的方法引用,因为MyClass.f是函数,而xi则不是,因为MyClass.i不是。
但是xf与MyClass.f是不同的-它是一个方法对象,而不是一个函数对象。

我有这个:

class MyClass:    
   """A simple example class"""    
   i = 12345   
   def f():    
      return 'hello world'

然后我这样做:

>>> x = MyClass()
>>> x.f
<bound method MyClass.f of <__main__.MyClass instance at 0x02BB8968>>
>>> MyClass.f
<unbound method MyClass.f>
>>> type(MyClass.f)
<type 'instancemethod'>
>>> type(x.f)
<type 'instancemethod'>

请注意,这两种类型x.fMyClass.f为instancemethod。类型没有区别,但本教程另有说明。有人可以澄清一下吗?


问题答案:

…或者为什么Python具有您指出的行为。

因此,首先请注意,这在3.x中是不同的。在3.x中,您将像预期的那样成为MyClass.f函数和x.f方法。这种行为本质上是一个糟糕的设计决策,后来又被更改。

原因是Python具有与大多数语言不同的方法的概念,该方法本质上是一个函数,其中第一个参数被预先填充为实例self)。这种预填充构成 绑定方法

>>> x.foo
<bound method MyClass.foo of <__main__.MyClass instance at 0x1004989e0>>

在Python 2.x和更早版本中,有理由认为未附加到实例的 方法 将是 未绑定方法 ,该 方法
是一个函数,其限制是第一个参数(self)必须是对象的实例。然后可以将其绑定到实例并成为 绑定方法

>>> MyClass.foo
<unbound method MyClass.foo>

随着时间的流逝,很明显的是,一个未绑定的方法实际上只是具有这个无关紧要的限制的函数,实际上并不重要(self必须是 “正确”
类型),因此将它们从语言中删除(在3.x版中)。这本质上是鸭式打字self,适合语言。

Python 3.3.0 (default, Dec  4 2012, 00:30:24) 
>>> x.foo
<bound method MyClass.foo of <__main__.MyClass object at 0x100858ed0>>
>>> MyClass.foo
<function MyClass.foo at 0x10084f9e0>

进一步阅读。

这是(从内存中压缩的)解释,可以从Python创造者Guido van Rossum自己的“ Python的历史”系列中完整地阅读。



 类似资料:
  • 我用Kotlin编写了这些方法并分析了字节码: null 上下文。我一直在Kotlin编码,我觉得它很神奇。但有时我需要做一个决定:例如,一个很重的不可变属性,在java中我会将其声明为static final,但在Kotlin中我发现很难“找到一个等价物”。

  • 我最近开始学习Spring。由于我是Spring的新手,我想到了几个问题。其中之一是: 如本文所述,“只要容器加载了spring配置,所有bean都会被实例化。org.springframework.context.ApplicationContext容器遵循预加载方法。”链接 1-这是否意味着使用Spring ApplicationContext创建的所有对象都是单例对象? 我创建了这个简单的测

  • 如您所知,< code>java.util.Objects是 这个类由用于操作对象的静态实用程序方法组成。 其中一个方法是< code>Objects.isNull()。 我的理解是< code>Objects.isNull()会通过省略第二个< code>=来消除意外地将空值赋给object的可能性。 但是,API注释指出: 此方法存在,可用作谓词、筛选器(对象::isNull) 是否有任何原因

  • 问题内容: 如你所知,是 此类包含用于对对象进行操作的静态实用程序方法。 此类方法之一是。 我的理解是,通过省略第二个,可以消除意外地为对象分配空值的机会。 但是,API注释指出: 存在此方法用作谓词filter(Objects :: isNull) 会不会有任何理由/环境对我应该使用了在 if语句 ? 应该只限于谓词吗? 问题答案: 应该在if语句中的Objects.isNull()上使用obj

  • 我有静态函数,它仅限于一些上下文(例如仅用于文档)。有两种替代方法可以将其定义为顶层函数或对象中的函数。 1. 2. 顶级函数的优点是它没有被包装在一个对象中,缺点是它可以从任何地方访问,没有类名前缀。这种情况有优点还是缺点或最佳实践?

  • 本文向大家介绍python实例化对象的具体方法,包括了python实例化对象的具体方法的使用技巧和注意事项,需要的朋友参考一下 python中同样使用关键字class创建一个类,类名称第一个字母大写,可以带括号也可以不带括号;python中实例化类不需要使用关键字new(也没有这个关键字),类的实例化类似函数调用方式; 创建类的对象(实例化类) python中实例化类不需要使用关键字new(也没有