У меня есть набор переменных в Python, некоторые из которых являются нормальными номерами Python, а некоторые из них являются экземплярами класса, который я написал с именем Property, который представляет диапазон возможных значений (например, между 0 и 4.2). Я хочу перебирать эту коллекцию и делать что-то другое в зависимости от того, является ли каждый элемент встроенным номером или Property. Конечно, я мог бы сделать это, явно проверив тип, но я хочу знать, есть ли чистый, объектно-ориентированный идиоматический способ сделать это в Python.Полиморфизм со встроенными типами в Python
Например, одна из вещей, которые я хочу сделать, зависит от знаков записей коллекции, поэтому я хочу написать функцию, которая возвращает знак своего аргумента, независимо от того, передан ли он встроенному типу или недвижимость. Я могу добавить метод __sign__
к свойству Property, но нет метода __sign__
для встроенных числовых типов, и Python не позволит мне добавить его, так что это не поможет.
Возможно, я просто ошибаюсь, имея коллекцию, которая смешивает экземпляры классов со встроенными типами, но изменение этого будет загромождать интерфейс моего кода. Вместо того, чтобы писать
myList = [0, 2.3, 4, Property(0,2)]
я должен был бы написать что-то вроде
myList = [Property(0), Property(2.3), Property(4), Property(0,2)]
, который я предпочел бы избежать, если это возможно.
Вот еще информация о том, что я пытаюсь сделать. Я работаю над научной проблемой, которая включает в себя отслеживание множества переменных, которые в определенной степени взаимосвязаны. Многие из этих переменных имеют известные значения (поскольку они были измерены), но некоторые из них неизвестны, а другие были измерены, но не точно, поэтому мы знаем, что они должны лежать в определенном диапазоне. Существуют уравнения, которые определяют взаимосвязи между этими переменными, и в конечном итоге я буду использовать библиотеку численной оптимизации, чтобы найти возможные диапазоны неизвестных переменных.
Поскольку существует множество переменных, я хочу хранить все известные данные о них в формате с отформатированным форматированием. Хотя я хочу сохранить этот файл python для простоты, важно сохранить его синтаксис как можно более простым, как для меня, так и потому, что его могут читать или добавлять не-программисты. В настоящее время она имеет множество линий, которые выглядят что-то смутно, как это:
a.set_some_parameters(3.2, -1, Property(2.3,2.5))
a.x = 0.1
b.x = Property.unknown()
a.set_some_other_parameters(Property.positive(), -4.2, 1, 0)
Дело в том, что (в значительной степени) в любом месте вы можете ввести номер, вы можете вместо этого ввести свойство, если значение точно не известно. Это хорошо работает как интерфейс, но я вхожу в ситуацию, описанную выше, где мой код постоянно должен иметь дело с тем, что что-то может быть встроенным числом, или может быть экземпляром Property.
насчет подклассов некоторый класс от (http://docs.python.org/library/numbers.html) модуля [числа]? – brandizzi
вы можете «попробовать: i.get_sign(), за исключением: ...» – jimifiki