0

私はPythonに非常に慣れていません.私はいくつかのPythonコードで作業しています.Pythonオブジェクト指向の概念をC++の概念にマッピングしようとしています.これは学習するのに良い方法だと思います.2種類のクラス定義にまたがることができます.

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

そして2つ目。

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

SourcetoPort のベースとチュートリアルのオブジェクトの違いは何ですか?

4

2 に答える 2

2

最初のケースでは SQLAlchemy を使用しているようです。間違いなく、宣言 (というか、実行) の違いを見逃すことはできません。

Python のクラスは静的言語のクラスとはかなり異なるという事実に加えて、クラスSourcePortはメタクラスに依存しています。

メタクラスは基本的に、クラスの内容を変更または動的に生成できる関数です。なんとなく C++ テンプレートを連想させますが、実行時に動作します (Python では、すべてが実行時に行われます)。

その奇妙なBaseクラス、またはその親の一部には、それにバインドされたメタクラスがあります。class SourcePort...ステートメントの実行後、SourcePortクラスの内容はメタクラスによって変更されます。メタクラスは、テーブル名、列などを説明する初期属性を読み取り、のフィールドであるSourcePortかのように名前でデータベース フィールドにアクセスするさまざまなメソッド、SourcePort列の内容を遅延ロードする可能性のあるゲッター (最初にそう宣言されている場合)、セッターを追加します。インスタンスの「ダーティ」状態、SourcePortORM オブジェクトをデータベース セッションにバインドするすべてのメカニズムなどを変更します。

そうです、深刻な違いがあります。

ちょっとした一方的なアドバイス: Python のクラスをよりよく理解するには、C++ のクラスに類推しようとするのをやめてください。いくつかの特徴を共有していますが、多くの違いがあります。Python クラスについて、あたかもまったく異質な概念であるかのように学んでください。

于 2013-05-04T07:06:25.213 に答える
2

objectPython 2.2では、親として持つべき新しいスタイル クラスが導入されました。object(祖父母)として持たなければ、古いスタイルのクラスになります。Python 3 では、すべてのクラスが「新規」です。

からの継承は、記述子、プロパティなどを含むobject多くの優れた機能を提供します。それらを使用しない場合でも、objectとにかく継承することをお勧めします。

于 2013-05-04T06:56:12.717 に答える