python-3.x - 继承与使用一个类的类对象作为另一个类的字段(Python 3)
问题描述
假设我们有一个产品可以通过 ID 号和一个 Quality 字段来识别,该字段又由几个值组成,其中一个是 2d 维度值。这是继承的情况还是仅将对象用作另一个类的字段?
在尝试使用 OOP 和类在 Python 中实现上述内容时,我想到了以下内容:
class Dimensions:
def __init__(self, x, y):
self.x = x
self.y = y
class Quality:
def __init__(self, val1, val2, dimensions):
self.val1 = val1
self.val2 = val2
self.dimensions = Dimensions
class Product:
def __init__(self, id, quality):
self.id = id
self.quality = Quality
我在上面尝试做的事情是通过继承实现的吗?
例如class Product (Quality):
如果是这样,在 Python 中定义上面的类时会是什么样子,我将如何传递父类的特定实例的字段(假设Dimensions
是等的父类Quality
)?
也许我的问题很幼稚,但我试图理解 Python 的类继承和结构方法;在网上搜索了 Python 中的示例,但找不到可以帮助我理解的示例。如果这在其他地方有答案,请分享链接,或者给我指出正确的方向。
从定义类和实例化每个类的代码中完成上面的示例将非常有帮助。
解决方案
我在上面尝试做的事情是通过继承实现的吗?
继承描述了“是”关系,所以问题是:1/产品是质量吗?和 2/ 是 Product 一个 Dimension 吗?
鉴于您自己的话:
我们有一个产品可以通过一个 ID 号和一个 Quality 字段来识别,该字段又由几个值组成,其中一个是 2d 维度值
这两个问题的答案都是明确的“否”:您的产品“不是”质量,它“具有”质量。这不是一个维度,而是有一个维度的质量。IOW,你想要组合(你已经在你的片段中拥有的东西),而不是继承。
也许我的问题很天真,但我试图了解 Python 的类继承和结构方法
这不是特定于 python 的,只是基本的 OO 设计。著名的“设计模式”一书(原版)的第一部分可能是我所知道的关于 OO 设计的最佳文本之一。
如果您还可以完成我的代码片段来说明类组合的方式(定义可以在这个例子中说明?例如,当实例化一个 Product 实例时,我会为它组成的其他类提供值吗?
这里没有一刀切的规则,它取决于上下文,特别是各种对象的生命周期。以最简单的形式,您明确地实例化每个对象并将它们相互传递,即:
class Dimensions:
def __init__(self, x, y):
self.x = x
self.y = y
class Quality:
def __init__(self, val1, val2, dimensions):
self.val1 = val1
self.val2 = val2
self.dimensions = dimensions
class Product:
def __init__(self, id, quality):
self.id = id
self.quality = quality
dimensions = Dimensions(1, 2)
quality = Quality("A", "B", dimensions)
product = Product(42, quality)
在光谱的另一端,您将所有“原始”值传递给产品,这创造了它的质量,它定义了它的尺寸:
class Dimensions:
def __init__(self, x, y):
self.x = x
self.y = y
class Quality:
def __init__(self, val1, val2, x, y):
self.val1 = val1
self.val2 = val2
self.dimensions = Dimensions(x, y)
class Product:
def __init__(self, id, val1, val2, x, y):
self.id = id
self.quality = Quality(val1, val2, x, y)
product = Product(42, "A", "B", 1, 2)
你当然可以使用任何变体,甚至使用它们都提供替代构造函数。这里的主要力量是尺寸和/或质量是否应该在产品之外具有生命,以及它们是否应该在产品之间共享。
推荐阅读
- java - W/系统:资源失败
- java - 使用 java Stream API 对日期进行排序、分组和计数
- python - Python多核比单核慢
- c++ - 为什么我可以使用 rdbuf() 从 const istream 构造 istreambuf_iterator?
- ios - SwiftUI -- 拉起 iPad 底座时检测 DragGesture 取消
- c++ - 为什么我超出范围?
- c++ - 如何在 CMake GUI 中显示 FooConfig.cmake 文件中的 CMake 变量?
- python - 我可以使 lambda 函数的输出依赖于条件而不声明一个函数来处理它吗?
- tensorflow - 如何将带有 kernel_regularizer 的 TensorFlow Conv2D 转换为 PyTorch
- python - 导入一个json文件,但一次只使用一行信息