面向对象编程:通过传递其他类

时间:2016-06-07 05:31:26

标签: python class object

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

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)中所做的那样吗?如果是,它的用语是什么?如果没有,我该如何解决这个问题?

3 个答案:

答案 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”等用于表示引用对象(在此处断言)。

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