2013-05-04 25 views
0

我對python非常陌生,我正在處理一些python代碼。我試圖將面向python面向對象的概念映射到那些C++,我認爲這是一種學習的好方法。兩類類定義。python中的類定義語法

class SourcetoPort(Base): 
    """""" 
    __tablename__ = 'source_to_port' 
    id = Column(Integer, primary_key=True) 
    port_no  = Column(Integer) 
    src_address = Column(String) 

    #---------------------------------------------------------------------- 
    def __init__(self, src_address,port_no): 
     """""" 
     self.src_address = src_address  
    self.port_no  = port_no 

和第二個。

class Tutorial (object): 
    def __init__ (self, connection): 
    print "calling Tutorial __init__" 
    self.connection = connection 
    connection.addListeners(self) 
    self.mac_to_port = {} 
    self.matrix={} 

我想知道SourcetoPort中的Base和Tutorial中的對象之間有什麼區別?

+1

你是什麼意思的差異? SourcePort是從Base派生的,Tutorial是從對象繼承而來的。 – 2013-05-04 06:33:19

+0

以下是['object']的文檔(http://docs.python.org/2/library/functions.html#object)。您可能會發現[此解釋](http://docs.python.org/2/glossary.html#term-new-style-class)(以及段落底部的鏈接)有用。 – Blender 2013-05-04 06:39:24

回答

2

您似乎在第一種情況下使用SQLAlchemy。你絕對不能錯過宣言(或者說,執行)的區別。

除了Python classes are rather different from classes in static languages這個事實,你的SourcePort類依賴於一個元類。

A metaclass本質上是一個可以改變或動態生成類內容的函數。它在某種程度上讓人聯想到C++模板,但是在運行時(在Python中,一切都在運行時發生)。

因此,奇怪的Base類,或它的一些父母,有一個綁定到它的元類。執行class SourcePort...語句後,SourcePort類的內容由元類修改。元類讀取解釋表名,列等的初始屬性,並添加到按名稱訪問數據庫字段的各種方法,就像它們是SourcePort的字段,可能會延遲加載列內容的getter(如果最初聲明爲這樣),修改了一個SourcePort實例的「骯髒」狀態,將ORM對象綁定到數據庫會話等的所有機制。

所以是的,存在着嚴重的差異。

一些不請自來的建議:爲了更好地理解Python類,停止嘗試類比C++類。他們有一些共同的特點,但是有很大的差異。只要瞭解Python類就好像這些是完全陌生的概念。

2

在Python 2.2中引入了新的風格類,它應該有object作爲父類。沒有object作爲(盛大)家長,它將是一個老式的班級。在Python 3中,所有的類都是「新的」。

object繼承給出許多nice features包括描述符,屬性等。即使你不打算使用它們,繼承object無論如何是個好主意。