【问题标题】:Right approach to append class object to a list将类对象附加到列表的正确方法
【发布时间】:2020-11-05 11:58:37
【问题描述】:

假设两个类如下:

class SomeClass():

    def __init__(self):
        self.elements = []
    
    def add_element(self, arg1, arg2):
        """[summary]

        Args:
            arg1 ([type]): [description]
            arg2 ([type]): [description]
        """

        element = AnotherClass(arg1, arg2)
        self.elements.append(element)
        return element

    def also_add_element(self, element):
        """[summary]

        Args:
            element ([type]): AnotherClass instance
        """

        self.elements.append(element)


class AnotherClass():
    """[summary]

    Args:
        arg1 ([type]): [description]
        arg2 ([type]): [description]
    """

    def __init__(self, arg1, arg2):

        self.arg1 = arg1
        self.arg2 = arg2

在元素列表中添加新项目的正确方法是什么?

s = SomeClass()
s.add_element(arg1, arg2)

s = SomeClass()
e = AnotherClass(arg1, arg2)
s.also_add_element(e)

首先,它似乎有些多余,因为它需要记录两次,但任何意见都值得赞赏。

【问题讨论】:

  • 您的类方法 .add_element(arg1, arg2).also_add_element(element) 缺少 self 参数。

标签: python list class object append


【解决方案1】:

执行以下操作不是更干净简单吗?

def add_element(self, element):
    self.elements.append(element)

然后,每当你想添加一个元素时,你就创建一个类的实例并传递它。

s = SomeClass()
a = AnotherClass(arg1, arg2)
s.add_element(a)

【讨论】:

    【解决方案2】:

    这取决于这些类实际上会做什么。您的示例与上下文无关,无法做出决定。没有一般规则。

    SomeClass 的对象是否意味着只聚合 AnotherClass 类的对象,或者是否有可能还会有其他类?您需要提供什么可扩展性?这个界面真的会保持add_element(self, arg1, arg2)吗?也许AnotherClass 的子类会在__init__ 中采用不同的参数?

    如果您正在处理创建将由外部项目使用的 API,那么还有一些关于 devX(开发人员体验)的注意事项,但我想说它们在大多数情况下排在第二位。同样,它们将取决于如何使用此接口。

    这里有一个有用的东西是the Creator pattern from GRASP。您正在尝试决定应该为代码的哪一部分分配创建AnotherClass 对象的责任——而该决定取决于这些类的目标、它们的接口、它们需要的关于彼此的信息等.

    在查看GRASP 之前,我建议您先查看SOLID 的原则,尤其是Single Responsibility Principle,并确保您对它有足够的了解,以避免创建一个超出其应有范围的类。

    【讨论】:

    • SomeClass 也意味着聚合来自其他类的对象:self.another_elements = [], self.even_other_elements = [] 等,add_ 方法只接受相应的类属性作为参数。
    • @BogdanTeodoru 这些对象会在SomeClass之外使用吗?如果有,在哪里?这些地方会在 Creator 模式中检查更多点吗?请注意,尽管这些原则谈论的是类,但它们背后的概念在某种程度上也适用于函数。
    • 聚合对象将仅用于SomeClass,其他任何地方都不会使用。
    • 那我会选择第一个选项。
    • docstring 对于classclass method 来说几乎相同,但我不认为这是一件坏事,对吧?
    猜你喜欢
    • 2021-12-10
    • 2020-09-27
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-19
    • 2015-09-28
    • 1970-01-01
    相关资源
    最近更新 更多