我有一個多年來一直使用的python模塊來處理一系列工作文本文件。我現在需要將某些信息存儲在數據庫中(使用SQLAlchemy),但我仍然希望在不使用數據庫支持的情況下使用該模塊的靈活性,即不必實際具有sqlalchemy import(或已安裝)。截至目前,我有以下...我一直在創建Product
或DBProduct
等取決於我打算使用數據庫或不。在運行時添加數據庫支持
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class Product(object):
pass
class WebSession(Product):
pass
class Malware(WebSession):
pass
class DBProduct(Product, Base):
pass
class DBWebSession(WebSession, DBProduct):
pass
class DBMalware(Malware, DBWebSession):
pass
但是,我覺得有一個更簡單/更清潔的方式來做到這一點。我覺得我正在創造一個繼承混亂和潛在的問題。理想情況下,我想創建一個Product
,WebSession
,WebSession
等類(也許使用裝飾器),其中包含使用數據庫的必要信息,但它只能在調用類似enable_db_support()
之後啓用/功能。一旦這個函數被調用,那麼無論我創建什麼對象,它本身(以及它繼承的所有對象)都會啓用所有列的綁定等。我還應該注意,如果我以某種方式找出如何將Product
和DBProduct
包含在一個類,我有時需要2個版本的相同功能:1如果啓用了db支持,則調用1,如果不支持則爲1。當enable_db_support()
被調用時,我也考慮過「重新創建」對象層次結構,但是結果也是一場噩夢。
任何幫助表示讚賞。
感謝您的回覆。這可能對我有用。我只需要研究關係問題。我傾向於依賴「關係」,但它仍然有效。謝謝。 – redlamb 2012-03-19 01:39:37
我越想到它,我想我會考慮採用這種方法,但並不是因爲需要在數據庫中存儲信息時潛在地覆蓋某些類的已定義函數。你知道是否有可能(或者我會如何去做)使用這種方法重新定義班級的某些功能?再次感謝。 – redlamb 2012-03-19 02:09:02
@redlamb:好吧,由於強大的python的強大功能,只需將方法分配給類,就可以在「enable_db_support()」中添加關係:'DBProduct.versions = relationship('ProductVersion',...) '。以同樣的方式,你可以重寫方法:你只需定義一個新的(非綁定)方法,比如'def db_override_me(self,param1,...):...'然後(重新)將它分配給你class:'DBProduct .override_me = db_override_me'。雖然我擔心這種類型的設計可能會有更好的解決方案...... – van 2012-03-19 07:13:06