沼泽地循环进口

2024-04-26 15:05:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个相互关联的对象。我希望能够通过相关属性访问另一个对象。在

例如A.b_relationship.obj.some_property

如何在不创建循环导入的情况下完成此操作?在

# lib.py
class Relationship(object):

    def __init__(self, obj):
        self.obj = obj


# a.py
class A(object):
    b_relationship = Relationship(B)

# b.py
class B(object):
    a_relationship = Relationship(A)

为了清楚起见,我添加了这个额外的示例。显然,SQLAlchemy用backref属性解决了这个问题。我不确定在不破坏棉花糖工作方式的情况下,将这种方法应用到棉花糖中有多可行。也许我需要改变我的心态?在

^{pr2}$

Tags: 对象pyselfobj属性objectlibdef
2条回答

您可以实现一个RelationshipManager(也称为注册表),所有可以成为关系一部分的类都必须注册到该注册表中。在

Relationship初始化器可以使用与其相关的类的名称,而不是实际的类对象。在

最后,relationship类本身可以从初始化时指定的名称(通过管理器)延迟加载与其相关的实际类。在

从这里开始: http://marshmallow.readthedocs.org/en/latest/nesting.html#two-way-nesting

查看如何将字符串用于类;AuthorSchema引用“BookSchema”:

class AuthorSchema(Schema):
    # Make sure to use the 'only' or 'exclude' params
    # to avoid infinite recursion
    books = fields.Nested('BookSchema', many=True, exclude=('author', ))
    class Meta:
        fields = ('id', 'name', 'books')

class BookSchema(Schema):
    author = fields.Nested(AuthorSchema, only=('id', 'name'))
    class Meta:
        fields = ('id', 'title', 'author')

我假设在您的例子中,您希望对many=False执行相同的操作。我从来没有用过棉花糖,但在Django中,它是类似的,我们使用类路径,如“my_应用程序MyClass“而不是MyClass以避免循环导入。在

相关问题 更多 >