python中的类定义语法

时间:2013-05-04 06:30:47

标签: python python-2.7

我是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中的对象有什么区别?

2 个答案:

答案 0 :(得分:2)

在Python 2.2中引入了新的样式类,它应该有object作为父类。没有object作为(大)父母,它将是一个旧的风格类。在Python 3中,所有类都是“新的”。

object的继承提供了许多nice features包括描述符,属性等。即使您不打算使用它们,最好还是继承object

答案 1 :(得分:2)

在第一种情况下,您似乎正在使用SQLAlchemy。你肯定不会错过声明(或者更确切地说,执行)的差异。

Python classes are rather different from classes in static languages之外,您的SourcePort类依赖于元类。

metaclass本质上是一个可以改变或动态生成类内容的函数。它在某种程度上让人联想到C ++模板,但在运行时(在Python中,一切都在运行时发生)。

因此,奇怪的Base类或其某些父类具有绑定到它的元类。执行class SourcePort...语句后,元类会修改SourcePort类的内容。元类读取解释表名,列等的初始属性,并添加SourcePort各种方法以按名称访问数据库字段,就像它们是SourcePort的字段一样,可能会延迟加载列的getter内容(如果最初声明的话),用于更改SourcePort实例的“脏”状态的setter,将ORM对象绑定到数据库会话的所有机制等等。

所以,是的,存在严重的差异。

一些未经请求的建议:为了更好地理解Python类,不要试图对C ++类进行类比。他们有一些共同点,但却存在着巨大的差异。只需了解Python类,就好像这些是一个完全不同的概念。