我有这个代码:
class A:
def __init__(self):
def method(self, item):
print self, ": Getting item", item
self.__getitem__ = types.MethodType(method, self, self.__class__)
class B(object):
def __init__(self):
def method(self, item):
print self, ": Getting item", item
self.__getitem__ = types.MethodType(method, self, self.__class__)
Run Code Online (Sandbox Code Playgroud)
然后这工作正常:
a = A()
a[0]
Run Code Online (Sandbox Code Playgroud)
但这不是:
b = B()
b[0]
Run Code Online (Sandbox Code Playgroud)
引发TypeError.
我发现新式类在类__dict__中寻找魔术方法而不是实例__dict__.这是正确的吗?为什么会这样?你知道任何解释背后的想法的文章吗?我试过RTFM,但也许不是正确的或没有抓到的东西......
非常感谢你!保罗
我定义了以下映射类
class A(Base):
__tablename__ = "a"
id = sqla.Column(sqla.Integer, primary_key = True)
number_a = sqla.Column(sqla.Integer)
b_collection = relationship('B', backref = backref('a'))
class B(Base):
__tablename__ = "b"
id = sqla.Column(sqla.Integer, primary_key = True)
id_a = sqla.Column(sqla.Integer, sqla.ForeignKey('a.id'))
number_b = sqla.Column(sqla.Integer)
Run Code Online (Sandbox Code Playgroud)
DB 中存储了这些对象:
a1 = A(number_a = 1)
a2 = A(number_a = 2)
b1 = B(number_b = 50, a = a2)
b2 = B(number_b = 51, a = a2)
Run Code Online (Sandbox Code Playgroud)
我需要的是通过仅发出一个查询来查询关系,以便它b_collection仅按该查询的结果预加载:
result = session.query(A).join(B).filter(B.number_b == 51).all()
Run Code Online (Sandbox Code Playgroud)
所以现在我想result[0].b_collection尊重过滤表达式并且不包含B实例 …