繁体   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