我是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中的对象有什么区别?
答案 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类,就好像这些是一个完全不同的概念。