2016-08-16 91 views
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

回答

1

使用超呼應該援引這樣的:

super(PurchaseItem, self).__init__(**kwargs)