【问题标题】:Python add object to list inside same object method [closed]Python将对象添加到同一对象方法中的列表[关闭]
【发布时间】:2014-03-12 04:27:05
【问题描述】:

我需要添加一个对象,例如Person,作为参数给出的列表。这是代码示例

class Person:

    def __init__(self, age):
        self.age = age

    def add_to_list(self, list_of_persons):
        list_of_persons.append(self)

我知道这种情况可能是由糟糕的代码设计引起的,但是,它正在处理我实现的一个小测试。我的问题是,这种设计将来会引起问题吗?如果有,是哪些?

【问题讨论】:

  • 可能不是,这是一个品味问题。但是people.append(person)而不是person.add_to_list(people)不是更直观吗?
  • 在类外追加怎么样,比如 obj = Person(); list_of_persons.append(obj)

标签: python list class oop python-2.7


【解决方案1】:

我真的想不出你不能用list.append(person) 呼叫代替对person.add_to_list(list) 的呼叫。

这里的问题是你在你的类 Person 和损害封装的列表对象之间添加了一个依赖项。如果稍后您想用另一个不具有“附加”方法的数据结构(例如自定义容器)替换列表,则必须添加另一个方法 Person.add_to_container 以保持一致性,或者添加一个附加方法到您的其他数据结构(如果可以并且这有意义的话)。

【讨论】:

    【解决方案2】:

    由于各种原因,我不喜欢您的解决方案,其中包括:

    • 元素不应为其在容器中的成员身份负责。然后添加和删除应该是容器的责任。
    • 您通常不希望方法修改参数。方法通常用于修改实例,可能会对参数产生一些副作用,但我不希望方法更改参数。
    • 除了隐藏Person 插入列表的方式之外,该方法没有添加任何实际功能。如果您遵循此设计,为什么不添加一个方法以从列表中删除 Person
    • 我发现:

      person.add_to_list(people)
      

      很不可读。

    如果您认为您不会更改Person 的容器,即您将始终使用list,为什么不直接使用列表?它更简单,开销更少,并且使您编写的代码更少:

        people = []
        people.append(Person(18))
    

    如果您认为自己可能要更改所使用的容器,那么我认为最好编写一个带有addremove 方法的People 类(以及任何其他方法)否则你需要)。在幕后People 可以使用它想要实现这些方法的任何容器。通过这种方式,您可以获得可读、直观和健壮的设计:

    class People(object):
        def __init__(self, people=()):
            self._members = list(people)
    
        # add other methods/special methods like __len__ etc.
    
        def add(self, person):
            self._members.append(person)
        def remove(self, person):
            self._members.remove(person)
    
    
    people = People()
    people.add(john)
    people.add(jack)
    
    
    # Change list to set?
    
    class People(object):
        def __init__(self, people=()):
            self._members = set(people)
        def add(self, person):
            self._members.add(person)
        def remove(self, person):
            self._members.remove(person)
    

    【讨论】:

    • 谢谢,'方法一般用于修改实例,可能对参数有一些副作用,但我不希望方法只更改参数。你能举一个修改实例的方法的例子吗?
    • @Marco list 类型的方法append。它修改应用该方法的实例。我的意思是,例如,list 没有任何方法可以修改其参数而不是其实例。事实上,我至少不记得标准库中有任何这样的东西,这应该表明这是一个坏主意。
    猜你喜欢
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    相关资源
    最近更新 更多