直到像一个小时前,我确信python Foo().bar()
只不过是Foo.bar (Foo())
的简写,它将实例作为第一个参数传递。在这个例子中,最后两行(显然)相同的事情:python方法查找,静态与实例
class Foo (object):
def bar (self): print "baz"
qux = Foo()
qux.bar()
Foo.bar (qux)
但现在我有了一个静态方法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方法查找,静态与实例”。您可以使用该术语获得更多答案,但技术性更强,更具吸引力。 – slezica 2011-06-01 20:37:39
@Santiago感谢您的意见。我改变了标题。 – Hyperboreus 2011-06-01 20:43:00
'()'周围的所有额外空间使我的眼睛受伤 – 2011-06-01 21:23:37