0
這些是什麼,我有相關的位:如何部分覆蓋/擴展聲明類的構造函數?
import sqlalchemy as db
import sqlalchemy.ext.declarative
Base = db.ext.declarative.declarative_base()
class Product(Base):
__tablename__ = 'product'
id = db.Column(db.Integer, primary_key=True)
class Bin(Base):
__tablename__ = 'bin'
id = db.Column(db.Integer, primary_key=True)
product_id = db.Column(db.Integer, db.ForeignKey('product.id'), nullable=False)
product = db.orm.relationship('Product')
class PurchaseItem(Base):
__tablename__ = 'purchase_item'
id = db.Column(db.Integer, primary_key=True)
bin_id = db.Column(db.Integer, db.ForeignKey('bin.id'), nullable=False)
bin = db.orm.relationship('Bin')
我想什麼是自動具有PurchaseItem
構造函數構造,如果它通過了Product
使用Bin
對象。我通常做的事:
def __init__(self, product=None, **kwargs):
if product is not None:
kwargs['bin'] = Bin(product=product)
super(PurchaseItem, self).__init__(self, **kwargs)
,但我得到這個錯誤:
>>> p = Product()
>>> pi = PurchaseItem(product=p)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 4, in __init__
File "/Users/andrea/src/ifs/src/venv/lib/python2.7/site-packages/sqlalchemy/orm/state.py", line 306, in _initialize_instance
manager.dispatch.init_failure(self, args, kwargs)
File "/Users/andrea/src/ifs/src/venv/lib/python2.7/site-packages/sqlalchemy/util/langhelpers.py", line 60, in __exit__
compat.reraise(exc_type, exc_value, exc_tb)
File "/Users/andrea/src/ifs/src/venv/lib/python2.7/site-packages/sqlalchemy/orm/state.py", line 303, in _initialize_instance
return manager.original_init(*mixed[1:], **kwargs)
File "<stdin>", line 11, in __init__
TypeError: _declarative_constructor() takes exactly 1 argument (3 given)
大概是因爲Base
是一個元類,並動態生成的子類構造函數。
我能夠得到我想要的東西通過存儲舊的構造,創造一個新的,然後調用舊:
_old_init = PurchaseItem.__init__
def _new_init(self, product=None, init=_old_init, **kwargs):
if product is not None:
kwargs['bin'] = Bin(product=product)
init(self, **kwargs)
PurchaseItem.__init__ = _new_init
有沒有辦法在PurchaseItem
類定義要做到這一點?否則,是否有一種方法不涉及臨時變量ala emacs的defadvice
?