2013-02-14 71 views
0

我试图创建一个从父类的元类继承一个类,我不喜欢说:我可以像这样创建从元类派生的子类吗?

from sqlalchemy import Column, String, create_engine 
from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy.orm import sessionmaker 


class Database(object): 
    """ 
     Class that holds all data models classes and functions 
    """ 
    def __init__(self, wenDbPath = "test.db"): 
     self.engine = create_engine('sqlite:///' + "c:/"+wenDbPath, echo=False) 
     self.Session = sessionmaker(bind=self.engine) 
     **self.Base** = declarative_base() # This returns a metaclass. 
     self.Base.metadata.create_all(self.engine) 
     self.session = self.Session() 

    class Element(**self.Base**): 
     __tablename__ = 'elements' 
     idNumber = Column(String(255), primary_key=True) 
     smallDiscription = Column(String(50), nullable=False) 
     longDiscription = Column(String()) 
     webLink = Column(String()) 

     def __init__(self, idNumber, smallDiscription, longDiscription, webLink): 
      self.idNumber = idNumber 
      self.longDiscription = longDiscription 
      self.smallDiscription = smallDiscription 
      self.webLink = webLink 
     def __repr__(self): 
      return "<Element ('%s : %s')>" % (self.idNumber, self.smallDiscription) 

的Python给了我下面的消息

class Element(self.Base): NameError: name 'self' is not defined

我怎样才能做这样的事情?

预先感谢您。

+0

定义外部类时,类范围中没有'self'。无论如何,你为什么要这样做? – Keith 2013-02-14 16:58:32

+0

我想将我所有的数据类放在一个地方 – zorro 2013-02-14 17:26:03

+0

如何使用常规方法并将所有类放入模块中? – Keith 2013-02-14 17:27:55

回答

0

在运行__init__之前评估课程正文。由于Base不依赖于__init__参数,你可以在评课时评价它:

class Database(object): 
    ... 
    Base = declarative_base() # This returns a metaclass. 
    class Element(Base): 
     ... 

请注意,您正在使用Base作为超,而不是一个元类;元类语法是__metaclass__ = Base(metaclass=Base),具体取决于版本。请参阅What is a metaclass in Python?

+0

谢谢你的帮助。 – zorro 2013-02-14 17:21:37

相关问题