【问题标题】:Is it OK if objects from different classes interact with each other?如果来自不同类的对象相互交互可以吗?
【发布时间】:2009-09-30 13:11:04
【问题描述】:

我刚开始使用 Python 中的面向对象编程。如果我创建一个使用另一个类的对象的类的方法是否可以,我会徘徊。换句话说,当我调用第一类的方法时,我将第二类的对象作为参数之一。然后,(第一类的)所考虑的方法可以由第二类的对象操作(以获取其属性或使用其方法)。 Python允许吗?这不被认为是一种糟糕的编程风格吗?

如果我用第一类的方法从第二类实例化对象可以吗?换句话说,如果我从第一个类调用一个方法,它会从第二个类实例化对象。

提前感谢您的帮助。

【问题讨论】:

    标签: python oop


    【解决方案1】:

    如果您正在谈论将一个对象的实例传递给另一个对象的方法,那么当然可以!这被认为是很好的做法。

    如果您想了解更多关于优秀的面向对象编码的信息,我可以提供一些建议的阅读材料:

    设计模式:可重用的面向对象软件的元素 作者:Erich Gamma、Richard Helm、Ralph Johnson、John M. Vlissides

    这本书被称为“四人帮”,它列出了许多似乎在面向对象代码中一次又一次出现的设计模式。这是一个了解如何以良好的面向对象方式处理某些问题的想法的好地方。

    另一个好:

    重构:改进现有代码的设计 作者:Martin Fowler、Kent Beck、John Brant、William Opdyke、Don Roberts

    这是一本很棒的书,可以帮助您了解编写面向对象代码时不应该做什么,以及如何在遇到它时修复它以使其变得更好。它提供了一个代码异味列表,这些异味暗示了糟糕的面向对象代码和一个重构参考部分,提供了有关如何修复这些异味并使它们更加面向对象的说明。

    【讨论】:

    • 太棒了。谢谢你。顺便问一下,不同类的对象相互交互可以吗?
    • 再次,是的,它是,但这取决于它们如何相互作用以及为什么相互作用。看看我推荐的两本书。它们涵盖了所有这些问题,而且非常详细。任何从事面向对象设计的人都需要阅读它们(至少,第一个是)。
    • 我只看了一眼设计模式这本书,但看起来阅读量很大。你可能想看看 Head First Design Patterns 这本书,它看起来更生动一些。 (如果你还想继续阅读原文,请继续阅读!)
    • 我会为 O'Reilly 学习 Python 这本书插入一个插件;它很好地涵盖了整个 Python 语言,并且将为您提供 Python 面向对象习语的良好开端。
    【解决方案2】:

    你说的很好。事实上,Python 中的大多数数据类型(字符串、整数、布尔值等)都是对象,因此几乎每种方法都按照您描述的方式工作。

    【讨论】:

      【解决方案3】:

      答案是它比 OK 更重要,这实际上是重点。

      当对象开始摆弄彼此的内部时,不是“OK”的。您可以通过使用前导下划线(或两个,这使得它对于子类也是内部的)调用本应为内部的事物来防止这种意外发生。这可以作为其他程序员的一个小标记,您不应该使用它,并且它不是官方 API,可以更改。

      【讨论】:

        【解决方案4】:

        我认为这没有问题,它一直在发生。您是否有想要解决的特定问题,或者只是在没有上下文的情况下提出一般性问题?

        【讨论】:

        • 目前这只是一个一般性问题。我正在考虑一般的事情(如何组织我的代码)。顺便问一下,我可以从第一类的方法实例化第二类的对象吗?
        • 你可以,但这不是一个好主意。你为什么不让工厂创建对象(除非你的意思是第二个类被指定为工厂,比它好)。
        • 是的。事实上,有一个类的设计模式就是这样做的,它被称为工厂类。
        【解决方案5】:

        得墨忒耳法则是关于您可以善意互动的方法和对象的一般指南。

        这是指导。你可以编写不遵循 LoD 的代码,但它是一个很好的指南,可以帮助你构建“结构害羞系统”——当你以后尝试进行重大更改时,你会欣赏这一点.

        http://en.wikipedia.org/wiki/Law_of_Demeter

        我建议您在不编码时阅读良好的 OO 实践和原则。可能是每天晚上或每隔一天几篇论文或一本书的一章。试试 SOLID 原则。您可以在这里找到它们的快速参考:

        http://agileinaflash.blogspot.com/2009/03/solid.html

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-08-14
          • 1970-01-01
          相关资源
          最近更新 更多