小编Pav*_*sko的帖子

在新式类中实现__getitem__

我有这个代码:

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,但也许不是正确的或没有抓到的东西......

非常感谢你!保罗

python python-2.7

5
推荐指数
1
解决办法
2690
查看次数

仅加载 SQLAlchemy ORM 中连接行的子集

我定义了以下映射类

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实例 …

python sqlalchemy

3
推荐指数
1
解决办法
2384
查看次数

标签 统计

python ×2

python-2.7 ×1

sqlalchemy ×1