Python缺乏静态类型使得可以在不导入类的情况下使用和依赖类。你应该导入它们吗?这有关系吗?
someclass.py
class SomeClass:
def __init__(self, some_value):
self.some_value = some_value
someclient.py
class SomeClient:
def __init__(self, some_class_instance):
self.some_class_helper = some_class_instance
在这里,SomeClient
的功能明显依赖于SomeClass
或至少表现得像它的东西。但是,someclient.py可以在没有import someclass
的情况下正常工作。这个可以吗?使用某些东西而不说任何你甚至使用它的东西都是错误的。
答案 0 :(得分:9)
是的,完全没问题。 some_class_instance
可能是任何内容,它不必是SomeClass
的实例。例如,您可能希望传递一个看起来像SomeClass
的实例,但使用不同的实现进行测试。
答案 1 :(得分:6)
导入SomeClass
对代码的工作方式没有任何影响。
如果您担心使代码可以理解,请评论SomeClient
期望SomeClass
实例和/或在文档字符串中记录它的事实。
如果您想警察 SomeClient
需要SomeClass
个实例,您可以assert
:
class SomeClient:
def __init__(self, some_class_instance):
assert isinstance(some_class_instance, SomeClass)
self.some_class_helper = some_class_instance
将要求导入SomeClass
。但请注意,你在那里相当严格 - 例如,它排除了使用模拟SomeClass
进行测试。 (这里有一个冗长的咆哮:"isinstance() considered harmful"。)
答案 2 :(得分:4)
在这种情况下,您不应导入该类。
Python依赖于所谓的“duck typing” - 如果它像鸭子一样走路,像鸭子那样嘎嘎叫,它也可能是一只鸭子。
您的代码并不关心程序运行时实际传递的类。所有它关心的是它的行为就像“SomeClass”行为一样。
<强>鸭打字强>
一种pythonic编程风格,用于确定对象的类型 检查其方法或属性 签名而不是明确的 与某种类型对象的关系(“如果 它看起来像一只鸭子,像一个嘎嘎叫 鸭子,它一定是鸭子。“) 强调接口而不是 特定类型,精心设计的代码 通过允许来提高其灵活性 多态替换。鸭打字 避免使用type()或 isinstance()。 (但请注意 鸭子打字可以补充 抽象基类。)相反,它 通常使用hasattr()测试或 EAFP编程。
答案 3 :(得分:1)
这是一个很好的python代码,“我们都同意这里的成年人”,也许如果你期望上课,你应该包括评论,那没关系。