Я придумал это, чтобы преодолеть недостаток .NET , который должен вручную выполнить глубокое копирование List & lt; T>.
Я использую это:
static public IEnumerable CloneList(List spotPlacements)
{
foreach (SpotPlacement sp in spotPlacements)
{
yield return (SpotPlacement)sp.Clone();
}
}
И в другом месте:
public object Clone()
{
OrderItem newOrderItem = new OrderItem();
...
newOrderItem._exactPlacements.AddRange(SpotPlacement.CloneList(_exactPlacements));
...
return newOrderItem;
}
Я попытался придумать oneliner, который делает это, но это невозможно, из-за того, что выход не работает внутри блоков анонимного метода.
Еще лучше использовать универсальный список & lt; T> cloner:
class Utility where T : ICloneable
{
static public IEnumerable CloneList(List tl)
{
foreach (T t in tl)
{
yield return (T)t.Clone();
}
}
}
Справочная информация:
В Python есть две встроенные функции для преобразования объекта в строку: str
vs. репр
. str
должна быть дружественной, удобочитаемой строкой. repr
должен включать подробную информацию о содержимом объекта (иногда они возвращают то же самое, например, для целых чисел). По соглашению, если есть выражение Python, которое вычисляет другой объект ==, repr
вернет такое выражение, например.
>>> print repr('hi') 'hi' # notice the quotes here as opposed to... >>> print str('hi') hi
Если возвращаемое выражение не имеет смысла для объекта, repr
должен возвращать строку, окруженную символами <и>, например.
.
Чтобы ответить на ваш исходный вопрос:
Дополнительно:
Вы можете контролировать способ преобразования экземпляра ваших собственных классов в строки, реализуя методы __ str __
и __ repr __
.
class Foo:
def __init__(self, foo):
self.foo = foo
def __eq__(self, other):
"""Implements ==."""
return self.foo == other.foo
def __repr__(self):
# if you eval the return value of this function,
# you'll get another Foo instance that's == to self
return "Foo(%r)" % self.foo
%s
вызовы __str()__
метод выбранного объекта и заменяет себя возвращаемым значением,
%r
вызовы __repr()__
метод выбранного объекта и заменяет себя возвращаемым значением.
Я читал в "Учении на горьком опыте Python", сказал автор, что
%r является лучшим для отладки, другие форматы для отображения переменных пользователям
Он вызывает repr ()
для объекта и вставляет полученную строку.
Смотрите Операции форматирования строк в документации. Обратите внимание, что %s, %d и т.д. могут работать не так, как вы ожидаете, если вы привыкли к тому, как они работают в другом языке, например, в C.
В частности, %s также хорошо работает для интов и плавающих чисел, если у вас нет особых требований к форматированию, где %d или %f дадут вам больше контроля.