【发布时间】:2011-06-01 20:33:46
【问题描述】:
直到一个小时前,我才确信在 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() 方法,该方法用随机值填充实例的属性。
#! /usr/bin/env python
# -*- coding: utf-8 -*-
import random
animals = [ ("Bella", "cow"), ("Spike", "dog"), ("José", "iguana"), ("Tux", "penguin") ]
class Animal (object):
@staticmethod
def populate (*args): return map (lambda x: Animal (*x), animals)
def __init__ (self, name = None, species = None):
def bar (): self.name, self.species = random.choice (animals)
self.name = name
self.species = species
self.populate = bar
def __repr__ (self): return "%s of species %s" % (self.name, self.species)
print Animal.populate ()
print Animal ("Pinky", "mouse")
qux = Animal ()
qux.populate ()
print qux
代码运行良好,但让我怀疑的是print Animal.populate (qux) 调用了静态填充方法(因此返回了一个列表并且没有填充可怜的 qux)。所以显然我认为Foo ().bar () 只不过是Foo.bar (Foo () ) 的简写是错误的。
这对我提出了各种问题:
- 当我拨打
Foo ().bar ()时会发生什么? - 当我拨打
Foo.bar (Foo () )时会发生什么? - 两者之间是否存在内部差异?
- 我是否遗漏了 python 的一些基本概念?
- 如果您必须编写一个类,该类的静态填充方法执行的操作除了在该类的实例上调用的填充方法之外,应该采用哪种方式?
(是的,它必须是相同的名称。)
【问题讨论】:
-
一个更有趣的标题是“Python 方法查找,静态与实例”。使用该术语您可能会得到更多答案,它更具技术性和吸引力。
-
@Santiago 感谢您的意见。我改了标题。
-
()周围的所有多余空格让我的眼睛受伤 -
De gustibus non est diputandum。我被
", ".join(map(lambda x:"%s"%x,zip(*pairs)[1]))之类的东西伤害了。空白 gusto 与方法查找有何关系? -
如果您从不从实例中调用它,我不确定拥有静态方法的意义。您是否将其与来自不同语言的静态方法混淆了?类方法在这里更有意义
标签: python static monkeypatching