Python将对象添加到同一对象方法中的列表

时间:2014-02-13 10:38:46

标签: python list class oop python-2.7

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

class Person:

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

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

我知道这种情况可能是由错误的代码设计引起的,但是,它正在进行一项我实施的小测试。我的问题是,这个设计将来会引发问题吗?如果是,那是哪一个?

2 个答案:

答案 0 :(得分:1)

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

  • 元素不应对其在容器中的成员资格负责。添加和删​​除当时应该是容器的责任。
  • 您通常不希望修改参数的方法。方法通常用于修改实例,可能会对参数产生一些副作用,但我不希望某种方法更改参数。
  • 该方法不会添加任何实际功能,只会隐藏Person插入列表的方式。如果你遵循这个设计,为什么没有你,例如,添加一个从列表中删除Person的方法?
  • 我找到了:

    person.add_to_list(people)
    

    相当难以理解。

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

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

如果您认为可能要更改所使用的容器,那么我认为最好使用People编写add类并且一个remove方法(以及你需要的任何其他方法)。幕后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)

答案 1 :(得分:0)

我无法想到您无法通过person.add_to_list(list)来电替换list.append(person)来电的情况。

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