Python模块导入中的继承与类实例化

4

如果这个不太好理解,很抱歉,我并不是一个有经验的程序员。

请考虑以下代码:

import mymodule

class MyClass:
    def __init__(self):
        self.classInstance = myModule.classInstance()

and then ......

from mymodule import classInstance

class MyClass(classInstance):
    def __init__(self):
        pass

如果我只想在MyClass中使用一个classInstance,从模块中导入特定的类并使MyClass继承这个类可行吗?
在决定使用这两种方法之间,有没有最佳实践或需要考虑的事项?
非常感谢。

4
这更多是一个面向对象编程的问题。请搜索“isa vs hasa”。也可以查看此链接 - tuxuday
2个回答

7

让我提出一个不同的例子。

假设你有一个向量类 Vector。现在你想要一个点类 Point。Point 可以用向量定义,但它可能具有其他额外的功能,而 Vector 没有这些功能。在这种情况下,你可以从 Vector 派生出 Point。

现在你需要一个线类 Line。Line 不是上述任何类的特化,因此你可能不想从任何一个类派生它。然而,Line 使用点。在这种情况下,你可能想要这样开始你的 Line 类:

class Line(object):
    def __init__(self):
        self.point1 = Point()
        self.point2 = Point()

这里的“point”将是类似于以下内容:

class Point(Vector):
    def __init__(self):
        Vector.__init__(self)

所以答案实际上是:取决于你需要做什么,但当你清楚知道自己要编写的内容时,选择是否继承变得显而易见。
希望这能有所帮助。

0

你好像在试图“选择”这两种方法,但它们完全不同。第二个定义了一个继承自一个(令人困惑的)名为classInstance的类的类。第一个定义了一个名为MyClass的类(除了基本的object类型之外没有继承任何东西),它有一个名为self.classInstance的实例变量,这恰好设置为classInstance类的一个实例。

为什么要将你的类命名为classInstance


以上两个示例都使 MyClass 可以访问 classInstance。我想我的问题是,哪一个最好使用,在什么情况下使用? - Sherlock
不完全是这样。一个通过继承给MyClass访问名为classInstance,而另一个通过属性给MyClass访问classInstance实例 - BrenBarn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接