Ваш инструктор, похоже, не "говорит на Python как на родном языке". ;) Вся концепция для класса довольно глупа; настоящие программисты на Python просто напрямую используют встроенные типы последовательностей. Но, к сожалению, такие вещи нормальны для академических упражнений ...
Добавление конструктора в класс Vector.
В Python распространенное «это то, как вы создаете новый объект и говорите, что это экземпляр», вещи обрабатываются внутренне по умолчанию, а затем объект baby передается в класс ' initialization способ превратить его в «правильный» экземпляр, установив атрибуты, которые должны иметь новые экземпляры класса. Мы называем этот метод __init__
.
Конструктор должен принимать один аргумент. Если этот аргумент является либо int, либо long, либо экземпляром класса, производного от одного из этих
Это проверено с помощью встроенной функции isinstance
. Вы можете найти это в документации (или попробовать help(isinstance)
в REPL).
В этом случае для построения вектора заданной длины с каждым элементом устанавливается значение 0.0.
В нашем __init__
мы обычно просто назначаем начальные значения для атрибутов. Первый параметр __init__
- это новый объект, который мы инициализируем, который мы обычно называем «я», чтобы люди понимали, что мы делаем. Остальные аргументы - это все, что было передано, когда вызывающая сторона запросила экземпляр. В нашем случае мы всегда ожидаем ровно один аргумент. У него могут быть разные типы и разные значения, поэтому мы должны дать ему общее имя.
Когда мы обнаруживаем, что универсальный аргумент является целочисленным типом с isinstance
, мы «конструируем» вектор, задавая соответствующие данные. Мы просто присваиваем некоторый атрибут self
(назовите его так, как имеет смысл), и значение будет ... хорошо, что вы собираетесь использовать для внутреннего представления данных вектора? Надеюсь, вы уже думали об этом:)
Если длина отрицательна, вызовите ValueError с соответствующим сообщением.
О, хорошо ... мы должны проверить это, прежде чем пытаться построить наше хранилище. Некоторые из очевидных способов сделать это в основном относились бы к отрицательному числу так же, как к нулю. Другие способы могут вызвать исключение, которое мы не можем контролировать.
Если аргумент не считается длиной, то, если аргумент является последовательностью (такой как список), то инициализируйте вектором длину и значения данной последовательности.
«Последовательность» - гораздо более размытое понятие; списки, кортежи и тому подобное не имеют базового класса «sequence», поэтому мы не можем легко проверить это с помощью isinstance
. (В конце концов, кто-то мог легко изобрести новый вид последовательности, о которой мы не думали). Самый простой способ проверить, является ли последовательность последовательностью, состоит в том, чтобы попытаться создать для нее итератор со встроенной функцией iter
. Это уже поднимет довольно значимое значение TypeError
, если вещь не повторяется (попробуйте!), Так что это облегчает обработку ошибок - мы просто позволяем ей делать свое дело.
Предполагая, что у нас есть итератор, мы можем легко создать наше хранилище: большинство типов последовательностей (и я предполагаю, что вы уже имеете в виду один из них, и этот, безусловно, включен) примут итератор для их __init__
метод и сделать очевидное копирование данных последовательности.
Затем реализуйте метод __repr__
, чтобы вернуть строку кода Python, которую можно использовать для инициализации вектора. Эта строка кода должна состоять из имени класса, за которым следует открывающая скобка, за которой следует содержимое вектора, представленного в виде списка, за которым следует закрывающая скобка. "
Надеюсь, это говорит само за себя. Подсказка: вы должны упростить это, используя собственный атрибут хранения __repr__
. Также рассмотрите возможность использования форматирования строки, чтобы соединить строку.