【发布时间】:2021-10-20 12:03:40
【问题描述】:
在这个问题中 How can I separate functions of class into multiple files? 最佳答案建议使用
from method_file import method
在类定义中,在单独的文件中定义类方法。但是,对于这样的课程
my_number.py
class MyNumber:
def __init__(self):
self.x = 5
from my_method import my_method
my_method.py
def my_method(self):
print(self.x)
IDE 不清楚self 指的是MyNumber 对象。因此代码完成(例如self.x)在my_method 中不可用。 self 的类型提示可以解决这个问题,即
my_method.py
from my_number import MyNumber
def my_method(self: MyNumber):
print(self.x)
但这会导致循环导入。
对于这种情况是否有任何解决方法或最佳实践?
【问题讨论】:
-
想知道您的 IDE 在这种情况下将如何处理它,但
def my_method(self: "MyNumber"):可能会工作。 -
我认为最好的做法是不要像这样跨多个模块拆分类的定义。例如,
MyNumber.my_method将看到与MyNumber.__init__不同的全局范围。 -
另请注意,最佳答案从未被接受。此外,将
imports 放在类定义的中间是一种糟糕的编程习惯。 -
您对一个文件中的“大量代码”有何顾虑?适当的源代码控制应该使多人处理一个文件成为非问题。
-
我相信 OP 的实际问题可以改写为“使用类型提示 + 类型检查器时如何避免循环导入”。当然“重写你的代码以避免循环导入”是一个解决方案,但我认为有一个替代方案是有价值的。讨论在运行时将函数绑定到类是否有意义似乎与此无关,因为循环导入 + 类型提示的相同问题可能出现在不同的上下文中。
标签: python class oop type-hinting