2015-10-16 3 views
2

В Python 3 я создал собственный класс C для конкретной структуры данных, который можно использовать в качестве итерабельной.Python min override

Но класс гарантирует, что для любой структуры данных c из C, c[0] будет минимальное значение всех значений в c.

Есть способ, что звонок в min(c) просто возвращает c[0] без бесполезного изучения всей структуры? (Или как обычно ValueError если c пуст)

+1

Я так не думаю. Было бы неплохо, если бы Python действительно был объектно-ориентированным? : P – Amadan

+1

'min()' в основном используется для нескольких объектов (или списка/iterable). не было бы лучше просто определить метод экземпляра 'min()' и вернуть 'c [0]' из него. И вызовите 'c.min()' вместо 'min (c)'. –

+0

@AnandSKumar Возможно, но гораздо меньше pythonic! – Xoff

ответ

1

Есть ли способ, что вызов мин (с) просто возвращает с [0]?

Да, есть два пути:

Первый модифицирует исходный код питона и изменить встроенный в структуру функции, которая не является мудрым и рациональным вообще.

Второй способ - создать свою собственную функцию min в относительном пространстве имен.

На самом деле на основе схемы разрешения имен python, которая называется LEGB manner. Когда вы используете неквалифицированное имя внутри области видимости, Python выполняет поиск до четырех областей, локальной (L) области, затем локальных областей любого приложения (E) (если он существует), затем глобальная область (G), а затем встроенная (B) область. Таким образом, из-за этого правила встроенная область будет искать в конце, и вы можете просто создать новую на верхний уровень этой сферы.

Но учтите, что в этом случае вы не могли использовать предыдущую функцию min, и если это произойдет, вы можете удалить функцию костюма с помощью инструкции del.

Но другой вещий путь с этой задачей является то, что создание min функции внутри вашего класса и использовать его в качестве атрибута:

>>> class C(object): 
... def __init__(self): 
...  self.index = 0 
...  self.iterable = range(10) 
... def __iter__(self): 
...  return self 
... def min(self): 
...  try: 
...   return self.iterable[self.index] 
...  except IndxError: 
...   raise Exception('The index is out of range') 
>>> c=C() 
>>> 
>>> c.min() 
0 
>>> c.iterable=[5,1,4,8] 
>>> c.min() 
5 

Обратите внимание, что в этом случае вы можете указать индекс по умолчанию для min функции для возврата относительного элемента.

 Смежные вопросы

  • Нет связанных вопросов^_^