类方法返回类实例:在单独文件中定义时如何避免循环导入错误?

2024-06-16 12:04:06 发布

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

我试图找出,将方法定义从类定义移动到不同文件时有哪些选项

示例:我有一个类,其方法返回同一类的新实例:

from __future__ import annotations

class C1:
    def __init__(self, val):
        self.val = val
    def added_to_val(self, to_add: float) -> C1:
        """Return new instance of class C1, with incremented value."""
        return C1(self.val + to_add)    

instA = C1(25)
instB = instA.added_to_val(2)
instB.val #27

现在我想将added_to_val移动到另一个文件(因为它实际上是一个长函数,而且很难读取),但这不起作用

以下是我所做的:

# file classdef.py
from __future__ import annotations
from .methoddef import _added_to_val

class C2:
    def __init__(self, val):
        self.val = val
    added_to_val = _added_to_val


# file methoddef.py
from .classdef import C2

def _added_to_val(instance: C2, to_add: float) -> C2:
    """Return new instance of class C2, with incremented value."""
    return C2(instance.val + to_add)

然而,这给出了一个ImportError: cannot import name '_added_to_val' from partially initialized module 'methoddef' (most likely due to a circular import)

有没有办法解决这个问题?或者返回同一类实例的类方法必须始终位于同一文件中吗



Tags: 文件to方法instancefromimportselfadd
1条回答
网友
1楼 · 发布于 2024-06-16 12:04:06

您可以概括该方法:

def _added_to_val(klass):
    """Return new instance of class C2, with incremented value."""
    def wrapped_added_to_val(instance: klass, to_add: float) -> klass:
        return klass(instance.val + to_add)
    return wrapped_added_to_val

然后像这样使用它:

class C2:
    def __init__(self, val):
        self.val = val
    def added_to_val(instance: C2, to_add: float) -> C2:
        return _added_to_val(C2)(instance, to_add)

警告:我还没有对此进行测试,特别是第一个代码段中的类型注释可能是错误的。我也希望我命名的功能更好,但它应该工作

相关问题 更多 >