Python组合

2024-09-28 13:31:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我只是想改进我在Python中的OO用法,对合成很感兴趣。在

例如,你有以下几类:

Class Breakfast(object):
    __init__(self, eggs):
        self.eggs = eggs

    @property
    def yolk(self):
        return eggs.yolk

    @property
    def yolk_colour(self):
        return eggs.yolk.colour
        OR
        return.eggs.yolk_colour

Class Eggs(object):
    __init__(self, yolk):
        self.yolk = yolk

    @property
    def yolk_colour(self):
        return self.yolk.colour

Class Yolk(object):
    __init__(self, colour):
        self.colour = colour

并初始化它们

^{pr2}$

当你想接触蛋黄时,是不是最好用链子锁起来

bkfast.eggs.yolk

或者通过一个酒店访问它

bkfast.yolk

第二个版本直接使用较少的链接,尽管仍在幕后进行。而第一个告诉你到底发生了什么。有没有更好的方法?在

编辑:我加入了蛋黄的属性,它有颜色。如果你想从早餐中获得这种颜色,那么最好是拥有一种称为鸡蛋属性的早餐属性,还是直接接触蛋黄本身?或者说它在幕后并不重要?在


Tags: selfreturn属性objectinit颜色defproperty
3条回答

精心设计的课程在某种程度上使问题变得复杂起来。这在某种程度上取决于您要做什么,或者具体地说,您正在使用的对象图是如何定义的。从breakfast跳到{}是不自然的……你不太可能直接跳到早餐总量中的蛋黄孩子身上。在

在这种情况下,合同很可能是早餐会提供egg对象,因此您将返回,然后在需要时从那里获取蛋黄(但这只涉及egg对象…breakfast不再关心。在

如果出于某种原因,你确实想一直抓住蛋黄,那么你应该使用委托。你永远不希望你的客户机代码比它必须或应该关心的更多(上面的德米特法则),你永远不想有任何东西,除了定义和管理的API泄漏到客户端代码。在

一个更合理的例子是假设你早餐时有不同形式的鸡蛋,因此鸡蛋可能来自盘子,或者一个小的煮鸡蛋架,或者来自一个玻璃“岩石”风格。在这种情况下,客户机代码仍然只需要鸡蛋,所以您需要使用委托,并从适当的盘子、支架或玻璃孩子中取出鸡蛋。

它可以归结为定义您向客户机代码公开的内容,并确保任何行李或实现细节都由接收对象处理和抽象。你总是想根据你所交付的东西而不是它的来源来工作。在

来自The Zen of Python

Explicit is better than implicit.
Simple is better than complex.

对我来说,这意味着你的例子没有具体问题就没有意义。如果你需要作曲,那就作曲吧。如果你不需要,就不用了。想想你的界面的意义,保持它的简单和明确。在

总之,早餐的蛋黄是关于什么的?在

在我看来,对于这个特定的例子,最好通过属性bkfast.yolk来访问它,因为这样您就可以自由地更改yolk的底层实现。在

相关问题 更多 >

    热门问题