इसलिए मेरे पास स्क्लाक्लेमी का उपयोग करके तालिकाओं का एक समूह है जिसे परिणामस्वरूप ऑब्जेक्ट के रूप में मॉडलिंग किया जाता है जो परिणाम से declarative_base()
पर कॉल करता है। अर्थात्:स्क्लेल्चेमी: एकाधिक विरासत से बचने और सार आधार वर्ग
Base = declarative_base()
class CommonRoutines(object):
@classmethod
def somecommonaction(cls):
# body here
class Table1(CommonRoutines, Base):
# __tablename__ & such here
class Table2(CommonRoutines, Base):
# __tablename__ & such here
बात मुझे पसंद नहीं है:
Base = declarative_base()
class Table1(Base):
# __tablename__ & such here
class Table2(Base):
# __tablename__ & such here
आदि मैं तो कुछ सामान्य कार्यक्षमता मेरी डीबी तालिका वर्गों में से प्रत्येक के लिए उपलब्ध करना चाहते थे, the easiest way to do this according to the docs सिर्फ एकाधिक वंशानुक्रम करना है इसके बारे में ए) सामान्य रूप से एकाधिक विरासत थोड़ा सा है (super()
कॉल इत्यादि जैसी मुश्किल हल करने वाली चीजें मिलती है), बी) यदि मैं एक नई तालिका जोड़ता हूं तो मुझे Base
और CommonRoutines
और सी) से उत्तराधिकारी को याद रखना होगा। "कॉमनराउटिन" वर्ग "एक-एक" तालिका में एक प्रकार का अर्थ है। वास्तव में CommonBase
एक सार आधार वर्ग है जो फ़ील्ड & दिनचर्या के सेट को परिभाषित करता है जो सभी तालिकाओं के लिए आम हैं। एक और तरीका रखो: "इसकी-एक" सारणी सारणी।
तो, मैं क्या करना चाहते हैं यह है:
Base = declarative_base()
class AbstractTable(Base):
__metaclass__ = ABCMeta # make into abstract base class
# define common attributes for all tables here, like maybe:
id = Column(Integer, primary_key=True)
@classmethod
def somecommonaction(cls):
# body here
class Table1(AbstractTable):
# __tablename__ & Table1 specific fields here
class Table2(AbstractTable):
# __tablename__ & Table2 specific fields here
लेकिन निश्चित रूप से यह काम नहीं करता, जैसा कि मैंने तो एक के लिए है) एक AbstractTable
के लिए __tablename__
, बी) एबीसी चीजों के पहलू को परिभाषित सिरदर्द के सभी प्रकारों का कारण बनता है, और सी) को AbstractTable
और प्रत्येक व्यक्तिगत तालिका के बीच कुछ प्रकार के डीबी रिश्ते को इंगित करना होता है।
तो मेरा प्रश्न: क्या यह उचित तरीके से हासिल करना संभव है? आदर्श रूप में मैं लागू करने के लिए करना चाहते हैं:
- कोई एकाधिक वंशानुक्रम
CommonBase
/AbstractTable
हो सार (यानी instantiated नहीं किया जा सकता है)
मुझे सही अगर मैं गलत हूँ, लेकिन उन "AbstractTable" विरासत "बेस" दिखाई देनी चाहिए, सही? (यानी 'कक्षा तालिका 1 (आधार): ') –
@ एडमपार्किन: ज़ाहिर है। ठीक कर दिया। – van
हाँ, यह वही था जो मैं ढूंढ रहा था। धन्यवाद! दृष्टिकोण के लिए एकमात्र कमी यह है कि अब 'कॉमनबेस' वर्ग की '__init__' को कॉल नहीं किया जाता है (' declarative_base' एक ऐसी कक्षा का उत्पादन करता है जो 'सुपर' को '__init__' में नहीं कहता है, इसलिए पायथन के सहकारी एकाधिक विरासत तंत्र नहीं हैं काम)। हम्म .... –