我创建了一个测试主题,以了解我的面向对象编程。
class Asset(object):
def __init__(self, project):
self.project = project
def do_something(self):
return self.project.x, self.project.y, True
class Project(object):
def __init__(self, x, y):
self.x = x
self.y = y
self.asset = Asset(self) # Is this correct?
def call_do_something(self):
return self.asset.do_something()
project_test = Project('foo', 'bar')
project_test.call_do_something()
我可以通过传递类Asset
的实例来初始化类Project
作为类Project
的属性,就像我在self.asset = Asset(self)
中所做的那样吗?如果是,它的用语是什么?如果没有,我该如何解决这个问题?
答案 0 :(得分:3)
是的,你完全可以。此设计模式称为继承组合
继承的构成(或复合重用原则) 面向对象编程是类应该的原则 通过组合实现多态行为和代码重用(通过 包含实现所需的其他类的实例 功能)而不是从基类或父类继承
阅读more
答案 1 :(得分:1)
是的,这是正确的。
您还可以将Asset
作为Project
构造函数的参数传递,如下所示:
class Asset(object):
def __init__(self, project=None):
self.project = project
class Project(object):
def __init__(self, x, y, asset):
self.x = x
self.y = y
self.asset = asset
self.asset.project = self
这样,您可以按如下方式初始化项目:
project = Project('foo', 'bar', Asset())
关系由Project
构造函数自动完成。
答案 2 :(得分:0)
这可以称为object composition,你主要表达的是:一个项目“有一个”断言。在大多数语言中,“field”,“property”等用于表示引用对象(在此处断言)。
对于设计模式继承的组合,它可能更复杂:组件和组合将具有相同的接口(从中派生),通常复合将具有组件列表。