我覺得你正在加入並不存在的差異。沒有像這樣的等級。在python 中,一切都是是一個對象。這不是一些抽象的概念,但對於如何考慮使用python時創建的構造而言,這非常重要。一個對象只是一堆其他對象。你是否使用new-style classes有一點微妙之處,但是如果沒有好的理由,那麼就使用並假設新式類。下面的一切都是假設新式的課程。
如果一個對象是callable,那麼可以使用一對大括號的調用語法來調用它,其中的參數是:my_callable(arg1, arg2)
。爲了可調用,對象需要實現__call__
方法(或者在其C級別類型定義中設置正確的字段)。
在Python中,一個對象有一個type
與它關聯。該類型描述了對象是如何構建的。因此,例如,列表對象的類型爲list
,函數對象的類型爲function
。類型本身是type
。您可以使用內置功能type()
找到該類型。所有內置類型的列表可以在python documentation中找到。類型實際上是可調用對象,用於創建給定類型的實例。
對,現在已經建立,給定對象的性質是由它的類型定義的。這描述了它包含的對象。回到你的問題然後:
首先,構成一些對象的一堆對象被稱爲該對象的屬性。這些屬性可以是任何東西,但通常由方法和存儲狀態的某種方式組成(可能是類型,如int
或list
)。
A function是function
類型的對象。至關重要的是,這意味着它具有__call__
方法作爲使其可調用的屬性(__call__
方法也是其本身具有__call__
方法的對象。它是__call__
一路下來;)
A class,在Python世界,可以被視爲一種類型,但通常用於指的是不是內置的類型。這些對象用於創建其他對象。您可以使用class關鍵字定義您自己的類,並且創建一個新風格的類,您必須從object
(或其他一些新風格的類)繼承。當你繼承時,你創建一個獲得父類型所有特徵的類型,然後你可以覆蓋你想要的位(並且你可以覆蓋你想要的任何位!)。當你通過調用它來實例化一個類(或者更一般地說,一個類型)時,返回由該類創建的另一個對象(如何通過修改類對象以奇怪和瘋狂的方式更改返回對象的創建方式)。
A method是一種特殊類型的函數,使用屬性表示法進行調用。也就是說,當它被創建時,2個額外的屬性被添加到方法中(記住它是一個對象!),稱爲im_self
和im_func
。我會用幾句話來描述。 im_func
是實現該方法的函數。當調用該方法時,例如foo.my_method(10)
,這相當於調用foo.my_method.im_func(im_self, 10)
。這就是爲什麼當你定義一個方法時,你需要使用額外的第一個參數來定義它,而這個第一個參數顯然似乎沒有使用(如self
)。
當您在定義一個類時編寫了一堆方法時,這些方法變成了未綁定的方法。當您創建該類的實例時,這些方法將變爲約束。當您調用綁定方法時,將爲您添加im_self
參數作爲綁定方法所在的對象。您仍然可以調用類的不受約束的方法,但你需要明確添加類實例作爲第一個參數:
class Foo(object):
def bar(self):
print self
print self.bar
print self.bar.im_self # prints the same as self
我們可以證明,當我們調用杆法的種種表現會發生什麼:
class MyFoo(object):
a = 10
def bar(self):
print self.a
這產生具有2個屬性的類:
>>> a = Foo()
>>> a.bar()
<__main__.Foo object at 0x179b610>
<bound method Foo.bar of <__main__.Foo object at 0x179b610>>
<__main__.Foo object at 0x179b610>
>>> Foo.bar()
TypeError: unbound method bar() must be called with Foo instance as first argument (got nothing instead)
>>> Foo.bar(a)
<__main__.Foo object at 0x179b610>
<bound method Foo.bar of <__main__.Foo object at 0x179b610>>
<__main__.Foo object at 0x179b610>
將所有上述共同,如下我們可以定義一個類a
(其是一個整數值10)和bar
,這是一個未綁定的方法。我們可以看到,MyFoo.a
只是10.
我們可以在運行時創建額外的屬性,既可以在類方法內部也可以在外部。考慮以下幾點:
class MyFoo(object):
a = 10
def __init__(self):
self.b = 20
def bar(self):
print self.a
print self.b
def eep(self):
print self.c
__init__
只是一個對象已經從一個類創建後立即調用的方法。
>>> foo = Foo()
>>> foo.bar()
10
20
>>> foo.eep()
AttributeError: 'MyFoo' object has no attribute 'c'
>>> foo.c = 30
>>> foo.eep()
30
這個例子顯示了2種方法在運行時添加到一個類的實例的屬性(即,該對象已經從它的類創建之後)。
我希望你可以看到,TestCase和TestSuite只是用來創建測試對象的類。對他們沒有什麼特別之處,只是它們碰巧有一些寫作測試的有用功能。你可以繼承和覆蓋它們到你的心中!
關於您的具體問題,這兩種方法和功能都可以返回任何他們想要的東西。
您對模塊,軟件包和套件的描述看起來很不錯。請注意,模塊也是對象!
編輯:我應該強調的問題是更多關於(標題);關於方法,功能和類的註釋很快且很簡短,以便給出範圍 - 並不打算成爲答案的主要焦點! =) 因此,對於被大魚吃掉的大魚:方法/函數/ TestCase通常位於Class/TestSuite中,通常位於Module/TestSuite中,通常位於包中 – xxjjnn 2012-03-26 11:54:07
我想這總結了常見的情況。長答案的要點是要明確說明沒有對象的層次結構。對象只是對象,如果你想要的話,你可以把頭部的層次結構轉換(根據類型允許)。 :) – 2012-03-26 15:30:05