Лучшее решение, чем передача None - в данном конкретном случае, а не в целом - это обработать параметр arr для __init__ как перечисляемый набор элементов для предварительной инициализации FruitContainer, а не массив для использования для внутреннее хранилище:
class FruitContainer:
def __init__(self, arr=()):
self.array = list(arr)
...
Это позволит вам передавать другие перечисляемые типы для инициализации вашего контейнера, что ожидают от более продвинутых пользователей Python:
myFruit = ('apple', 'pear') # Pass a tuple
myFruitContainer = FruitContainer(myFruit)
myOtherFruit = file('fruitFile', 'r') # Pass a file
myOtherFruitContainer = FruitContainer(myOtherFruit)
Это также устранит еще одну потенциальную ошибку псевдонимов:
myFruit = ['apple', 'pear']
myFruitContainer1 = FruitContainer(myFruit)
myFruitContainer2 = FruitContainer(myFruit)
myFruitContainer1.addTo('banana')
'banana' in str(myFruitContainer2)
Со всеми другими реализациями на этой странице это вернет True, потому что вы случайно указали псевдоним внутреннего хранилища ваших контейнеров.
Примечание: Этот подход не всегда правильный ответ: «если не None» лучше в других случаях. Просто спросите себя: я передаю набор объектов или изменяемый контейнер? Если класс / функция, в которую я передаю свои объекты, изменяет хранилище, которое я ему предоставил, это будет (а) неожиданно или (б) желательно? В этом случае я бы сказал, что это (а); Таким образом, вызов списка (...) является лучшим решением. Если (б), «если не None» будет правильным подходом.