继承与使用一个 class 的 class 对象作为另一个 class 的字段 (Python 3)
Inheritance vs using a class object of one class as a field of another class (Python 3)
假设我们有一个可以通过 ID 号和质量字段识别的产品,质量字段又由多个值组成,其中一个是二维值。这是 继承的情况还是只是将一个对象用作另一个 classes 的字段?
在尝试使用 OOP 和 classes 在 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 中定义上面的 class 会是什么样子,我将如何传递父 class 的特定实例的字段(假设 Dimensions
是 Quality
等的父级)?
也许我的问题很天真,但我正在尝试理解 Python 的 Class 继承和结构方法;在 Python 中在线搜索示例,但找不到可以帮助我理解的示例。如果这在其他地方有答案,请分享 link 或者给我指明正确的方向。
通过定义 classes 并实例化它们中的每一个在代码中完成上面的示例会很有帮助。
Is what I am trying to do above achieved via inheritance?
继承描述了一种 "is a" 关系,所以问题是:1/ 产品是质量吗?和 2/ 是产品维度吗?
鉴于你自己的话:
we have a product which is identifiable by an ID number and a Quality field which is in turn comprised of several values, one of which is 2d dimensions values
这两个问题的答案都很明确 "NO":您的产品 "is" 不是质量,它 "has" 是质量。这不是一个维度,而是具有维度的质量。 IOW,你想要合成(你的代码片段中已有的),而不是继承。
Perhaps my question is naive but I am trying to understand Python's approach of Class inheritance and structure
这与 python 无关,只是基本的 OO 设计。 the famous "Design patterns" book(原文)的第一部分可能是我所知道的关于 OO 设计的最好的教科书之一。
If you could also complete my code snippet to illustrate how class composition (definition could be illustrated in this example? e.g. when instantiating a Product instance, will I provide the values for the other classes it is composed from?
这里没有放之四海而皆准的规则,它取决于上下文,特别是取决于各种对象的生命周期。在最简单的形式中,您明确地实例化每个对象并将它们传递给彼此,即:
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)
在光谱的另一端,您将所有 "raw" 值传递给产品,这创造了它的质量,定义了它的尺寸:
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)
你当然可以使用任何变体,甚至可以使用它们来提供备用构造函数。这里的主要力量是维度 and/or 质量是否应该在产品之外有生命,以及它们是否应该在产品之间共享。
假设我们有一个可以通过 ID 号和质量字段识别的产品,质量字段又由多个值组成,其中一个是二维值。这是 继承的情况还是只是将一个对象用作另一个 classes 的字段?
在尝试使用 OOP 和 classes 在 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 中定义上面的 class 会是什么样子,我将如何传递父 class 的特定实例的字段(假设 Dimensions
是 Quality
等的父级)?
也许我的问题很天真,但我正在尝试理解 Python 的 Class 继承和结构方法;在 Python 中在线搜索示例,但找不到可以帮助我理解的示例。如果这在其他地方有答案,请分享 link 或者给我指明正确的方向。
通过定义 classes 并实例化它们中的每一个在代码中完成上面的示例会很有帮助。
Is what I am trying to do above achieved via inheritance?
继承描述了一种 "is a" 关系,所以问题是:1/ 产品是质量吗?和 2/ 是产品维度吗?
鉴于你自己的话:
we have a product which is identifiable by an ID number and a Quality field which is in turn comprised of several values, one of which is 2d dimensions values
这两个问题的答案都很明确 "NO":您的产品 "is" 不是质量,它 "has" 是质量。这不是一个维度,而是具有维度的质量。 IOW,你想要合成(你的代码片段中已有的),而不是继承。
Perhaps my question is naive but I am trying to understand Python's approach of Class inheritance and structure
这与 python 无关,只是基本的 OO 设计。 the famous "Design patterns" book(原文)的第一部分可能是我所知道的关于 OO 设计的最好的教科书之一。
If you could also complete my code snippet to illustrate how class composition (definition could be illustrated in this example? e.g. when instantiating a Product instance, will I provide the values for the other classes it is composed from?
这里没有放之四海而皆准的规则,它取决于上下文,特别是取决于各种对象的生命周期。在最简单的形式中,您明确地实例化每个对象并将它们传递给彼此,即:
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)
在光谱的另一端,您将所有 "raw" 值传递给产品,这创造了它的质量,定义了它的尺寸:
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)
你当然可以使用任何变体,甚至可以使用它们来提供备用构造函数。这里的主要力量是维度 and/or 质量是否应该在产品之外有生命,以及它们是否应该在产品之间共享。