我需要添加一个对象,例如Person
,以作为参数提供的列表。这是代码的示例
class Person:
def __init__(self, age):
self.age = age
def add_to_list(self, list_of_persons):
list_of_persons.append(self)
我知道这种情况可能是由错误的代码设计引起的,但是,它正在进行一项我实施的小测试。我的问题是,这个设计将来会引发问题吗?如果是,那是哪一个?
答案 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方法到你的其他数据结构(如果可以,如果这是有意义的话)。