你应该导入你在Python中使用的所有类吗?

时间:2009-10-12 20:35:36

标签: python coding-style

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的情况下正常工作。这个可以吗?使用某些东西而不说任何你甚至使用它的东西都是错误的。

4 个答案:

答案 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代码,“我们都同意这里的成年人”,也许如果你期望上课,你应该包括评论,那没关系。