直到像一個小時前,我確信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