2012-03-25 29 views
1

最佳推測:Python的套件,封裝,模塊,測試用例和TestSuite的差異

  • 方法 - DEF(個體,maybeSomeVariables);其達到某種目的
  • 功能的代碼行 - 相同的方法,但返回的東西
  • 類 - 基團的方法/函數
  • 模塊 - 一個腳本,或者一個或多個類。基本上是一個.py文件。
  • 包 - 一個文件夾裏有模塊,裏面還有一個__init__.py文件。
  • 套房 - 只是,被周圍很多拋出一個字,按照慣例
  • 測試用例 - 單元測試的等價功能的
  • 的TestSuite - (或模塊)單元測試的相當於一類

我的問題是:這是完全正確的,我錯過了該列表中的任何分層構建塊嗎?

+0

編輯:我應該強調的問題是更多關於(標題);關於方法,功能和類的註釋很快且很簡短,以便給出範圍 - 並不打算成爲答案的主要焦點! =) 因此,對於被大魚吃掉的大魚:方法/函數/ TestCase通常位於Class/TestSuite中,通常位於Module/TestSuite中,通常位於包中 – xxjjnn 2012-03-26 11:54:07

+0

我想這總結了常見的情況。長答案的要點是要明確說明沒有對象的層次結構。對象只是對象,如果你想要的話,你可以把頭部的層次結構轉換(根據類型允許)。 :) – 2012-03-26 15:30:05

回答

1

我覺得你正在加入並不存在的差異。沒有像這樣的等級。在python 中,一切都是是一個對象。這不是一些抽象的概念,但對於如何考慮使用python時創建的構造而言,這非常重要。一個對象只是一堆其他對象。你是否使用new-style classes有一點微妙之處,但是如果沒有好的理由,那麼就使用並假設新式類。下面的一切都是假設新式的課程。

如果一個對象是callable,那麼可以使用一對大括號的調用語法來調用它,其中的參數是:my_callable(arg1, arg2)。爲了可調用,對象需要實現__call__方法(或者在其C級別類型定義中設置正確的字段)。

在Python中,一個對象有一個type與它關聯。該類型描述了對象是如何構建的。因此,例如,列表對象的類型爲list,函數對象的類型爲function。類型本身是type。您可以使用內置功能type()找到該類型。所有內置類型的列表可以在python documentation中找到。類型實際上是可調用對象,用於創建給定類型的實例。

對,現在已經建立,給定對象的性質是由它的類型定義的。這描述了它包含的對象。回到你的問題然後:

首先,構成一些對象的一堆對象被稱爲該對象的屬性。這些屬性可以是任何東西,但通常由方法和存儲狀態的某種方式組成(可能是類型,如intlist)。

A functionfunction類型的對象。至關重要的是,這意味着它具有__call__方法作爲使其可調用的屬性(__call__方法也是其本身具有__call__方法的對象。它是__call__一路下來;)

A class,在Python世界,可以被視爲一種類型,但通常用於指的是不是內置的類型。這些對象用於創建其他對象。您可以使用class關鍵字定義您自己的類,並且創建一個新風格的類,您必須從object(或其他一些新風格的類)繼承。當你繼承時,你創建一個獲得父類型所有特徵的類型,然後你可以覆蓋你想要的位(並且你可以覆蓋你想要的任何位!)。當你通過調用它來實例化一個類(或者更一般地說,一個類型)時,返回由該類創建的另一個對象(如何通過修改類對象以奇怪和瘋狂的方式更改返回對象的創建方式)。

A method是一種特殊類型的函數,使用屬性表示法進行調用。也就是說,當它被創建時,2個額外的屬性被添加到方法中(記住它是一個對象!),稱爲im_selfim_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只是用來創建測試對象的類。對他們沒有什麼特別之處,只是它們碰巧有一些寫作測試的有用功能。你可以繼承和覆蓋它們到你的心中!

關於您的具體問題,這兩種方法和功能都可以返回任何他們想要的東西。

您對模塊,軟件包和套件的描述看起來很不錯。請注意,模塊也是對象!