我最近重构了我的代码,以放置在他们自己的模块validate.py
中的几个类之间共享的输入验证方法。其中一些验证方法检查其输入是否是类的实例,例如 MyClass
。因此,validate.py
必须导入MyClass
,因此方法is_MyClass
可以检查是否isinstance(input, MyClass)
。但是,我想在validate.py
中使用MyClass
中的一些验证方法来清理对MyClass.my_method
的输入,因此MyClass
必须导入validate.py
。
但是,代码重用是一个好主意。那么以这种方式共享验证方法的最佳实践是什么?
答案 0 :(得分:1)
我认为特定于其中一个类的验证代码部分可能应该放入类本身 - 也许作为类方法?通过这种方式,'泛型'验证码只能在适当的时候调用obj.validate()。然后,您不需要从通用验证代码中导入类。
答案 1 :(得分:1)
尽管Tom Dalton的答案在最佳设计方面可能是正确的,但值得注意的是导入循环在Python中通常可以正常工作。
但是,限制是您需要使用import my_module
语法并避免使用导入模块的顶级(全局)代码。声明使用导入模块的函数(或带有方法的类)很好。
如果您使用from my_module import obj
或类似内容,通常会遇到麻烦,因为只有在其他模块中已定义obj
时才会有效。如果该其他模块正在导入您的模块,则可能尚未发生类定义或全局变量赋值。
因此,对于您的具体情况,替代解决方案可能是让您的validate
模块使用import my_class
,然后is_MyClass
可以执行isinstance(input, my_class.MyClass)
。