簡體   English   中英

python中的類定義語法

[英]Class definition syntax in python

我對python非常陌生,正在使用一些python代碼,正在嘗試將python面向對象的概念映射到C ++的概念,我認為這是學習的一種好方法。我可以跨兩種類型的類定義。

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中的對象之間有什么區別?

在Python 2.2中,引入了新樣式類,這些類應具有object作為父object 如果沒有object作為(祖父母)父母,那么它將是一個舊樣式類。 在Python 3中,所有類都是“新的”。

object繼承提供了許多不錯的功能,包括描述符,屬性等。即使您不打算使用它們,還是要繼承object是一個好主意。

您似乎在第一種情況下使用SQLAlchemy。 您絕對不能錯過聲明(或執行)上的差異。

除了Python類與靜態語言類完全不同之外 ,您的SourcePort類還取決於元類。

元類本質上是一個可以更改或動態生成類內容的函數。 它以某種方式讓人聯想到C ++模板,但在運行時執行操作(在Python中,所有操作都在運行時發生)。

這樣奇怪的Base類或它的某些父類就綁定了一個元類。 執行class SourcePort...語句之后,元類將修改SourcePort類的內容。 元類讀取解釋表名,列等的初始屬性,並向SourcePort添加各種方法來按名稱訪問數據庫字段,就好像它們是SourcePort的字段一樣,getter可能會延遲加載列內容(如果最初聲明是這樣),設置程序,更改SourcePort實例的“臟”狀態,將ORM對象綁定到數據庫會話的所有機制,等等。

是的,兩者之間存在嚴重差異。

一些不請自來的建議:為了更好地理解Python類,請停止嘗試與C ++類進行類比。 它們具有一些特征,但差異很大。 只需了解Python類,就好像它們是一個完全陌生的概念一樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM