Python方法查找,静态vs.instan

2024-04-26 18:36:28 发布

您现在位置:Python中文网/ 问答频道 /正文

直到大约一小时前,我还确信在python中Foo ().bar ()不过是Foo.bar (Foo () )的简写,它将实例作为第一个参数传递。在本例中,最后两行的作用(显然)是相同的:

class Foo (object):
    def bar (self): print "baz"

qux = Foo ()
qux.bar ()
Foo.bar (qux)

但现在我有一个Animal类,它有一个静态方法populate(),它返回人类已知的所有动物的列表。另外,每个Animal实例都有一个populate()方法,该方法用随机值填充实例的属性。在

^{pr2}$

代码运行得很好,但是让我怀疑的是print Animal.populate (qux)调用了静态populate方法(因此返回了一个列表,没有填充可怜的qux)。显然,我认为Foo ().bar ()不过是Foo.bar (Foo () )的简写,这是错误的。在

这给我提出了各种各样的问题:

  1. 当我调用Foo ().bar ()时会发生什么?在
  2. 当我调用Foo.bar (Foo () )时会发生什么?在
  3. 两者之间有内在的区别吗?在
  4. 我错过了python的一些基本概念吗?在
  5. 如果您必须编写一个类,它的静态populate方法执行的操作与通过该类的实例调用的populate方法不同,那么哪种方法是正确的?在

(是的,它必须是同一个名字。)


Tags: 实例方法列表objectfoo静态barclass
3条回答

qnx.populate()首先在实例qnx上查找populate。如果没有,那么__mro__将被跟随,直到找到一个名为populate的东西。在

Animals.populate(qnx)正在跳过上述查找的第一步

静态方法和类方法是special descriptors。由于描述符的__get__()方法的参数包括类和任何相关实例,因此它们可以以任何方式将参数拧入方法。在

关于Foo().bar()之间的区别,美食酒吧(Foo())和美食酒吧()(作为回答,因为我昨天注册了,还不能发表评论)-这是因为Python(<;3.0)的“绑定”和“未绑定”方法的概念-它严格要求,除了@staticmethod或@classmethod外,方法调用必须有一个与之关联的实例。没有什么比你必须记住的事情更容易解释的了。 值得庆幸的是,这在Python3中发生了变化,“‘绑定’和‘非绑定’方法作为独立的东西的概念已经不复存在,并且美食酒吧()对你的例子来说很好。在

相关问题 更多 >