面向对象编程:通过传递其他类的实例来初始化类的对象



我创建了一个测试主题来理解我的面向对象编程。

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()

我可以通过传递类Project的实例来将类Asset初始化为类Project的属性,就像我在self.asset = Asset(self)中所做的那样吗?如果是,它的术语是什么?如果没有,我该如何解决这个问题?

是的,你完全可以。此设计模式称为组合重于继承

组合重于继承(或复合重用原则) 面向对象编程是类应该遵循的原则 通过其组合实现多态行为和代码重用(通过 包含实现所需 功能),而不是从基类或父类继承

阅读更多

是的,这是正确的。

您还可以将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构造函数自动完成。

这可以称为对象组合,你主要表达的是:一个项目"有一个"断言。在大多数语言中,"字段","属性"等用于表示引用对象(此处断言)。

对于设计模式组合而不是继承,它可能更复杂:组件和复合将具有相同的接口(派生自它),并且通常复合将具有组件列表。

最新更新