Вектор в питоне - PullRequest
       7

Вектор в питоне

1 голос
/ 25 ноября 2011

Я работаю над этим проектом, который имеет дело с векторами в Python. Но я новичок в Python и не знаю, как его взломать. Вот инструкция:

"Добавить конструктор к классу Vector. Конструктор должен принимать один аргумент. Если этот аргумент является либо int, либо long, либо экземпляром класса, производного от одного из них, то этот аргумент следует считать длиной экземпляра Vector. В этом случае создайте Vector заданной длины с каждым элементом, равным 0.0. Если длина отрицательная, вызовите ValueError с соответствующим сообщением. Если аргумент не считается длиной, то если аргумент является последовательностью (такой как список), то инициализируйте вектором длину и значения данной последовательности. Если аргумент не используется в качестве длины вектора и если это не последовательность, то поднимите Введите ошибку с соответствующим сообщением.

Затем реализуйте метод __repr__, чтобы вернуть строку кода Python, которую можно использовать для инициализации вектора. Эта строка кода должна состоять из имени класса, за которым следует открывающая скобка, за которой следует содержимое вектора, представленного в виде списка, за которым следует закрывающая скобка. "

Я не уверен, как выполнять проверку типов классов, а также как инициализировать вектор на основе заданного объекта. Может ли кто-нибудь помочь мне с этим? Спасибо!

Ответы [ 5 ]

2 голосов
/ 25 ноября 2011

Ваш инструктор, похоже, не "говорит на 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__. Также рассмотрите возможность использования форматирования строки, чтобы соединить строку.

0 голосов
/ 25 ноября 2011

Это может или не может быть уместно в зависимости от домашней работы, но в программировании на Python не очень обычно явно проверять тип аргумента и изменять поведение на его основе.Более нормально просто попытаться использовать функции, которые вы ожидаете от него (возможно, перехват исключений, если необходимо вернуться к другим опциям).

В этом конкретном примере обычный программист на Python, реализующий Vector, который должен былработать таким образом, будет пытаться использовать аргумент , как если бы это было целое число / длинное (подсказка: что произойдет, если вы умножите список на целое число?), чтобы инициализировать вектор и, если это вызовет исключение, попробуйте использовать его как если бы это была последовательность, и если это тоже не удалось, то вы можете выбросить TypeError.

. Причина этого в том, что он оставляет ваш класс открытым для работы с другимиТипы объектов, которые люди придумывают позже, не являются целыми числами или последовательностями, а работают как они.В частности, очень сложно всесторонне проверить, является ли что-то «последовательностью», потому что определяемые пользователем классы, которые могут использоваться в качестве последовательностей, не обязательно должны быть экземплярами какого-либо общего типа, который вы можете проверить.Класс Vector сам по себе является хорошим кандидатом для использования для инициализации Vector, например!

Но я не уверен, что именно такой ответ ожидает ваш учитель.Если вы еще не узнали об обработке исключений, то вы почти наверняка не собираетесь использовать этот подход, поэтому, пожалуйста, игнорируйте мой пост.Удачи в обучении!

0 голосов
/ 25 ноября 2011

Существует много примеров того, как проверять типы в Python в StackOverflow (см. Мой комментарий для самого высокого рейтинга).

Чтобы инициализировать класс, используйте метод __init__:

class Vector(object):
    def __init__(self, sequence):
        self._internal_list = list(sequence)

Теперь вы можете вызывать:

my_vector = Vector([1, 2, 3])

А внутри других функций в Vector вы можете обратиться к self._internal_list.Я поставил _ перед именем переменной, чтобы указать, что ее нельзя изменять извне класса.

Документация для функции list может быть полезна для вас.

0 голосов
/ 25 ноября 2011

Вы можете выполнить проверку типа с помощью isinstance .

Инициализация класса с использованием метода __ init __ .

Удачи вам в выполнении задания: -)

0 голосов
/ 25 ноября 2011

Все, что вам нужно для начала, находится здесь: http://docs.python.org/library/functions.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...