Python STD Методы иерархии Звонки документированы?

StackOverflow https://stackoverflow.com/questions/4053662

  •  27-09-2019
  •  | 
  •  

Вопрос

Просто столкнулся с проблемой в Dict «Тип» подклассов. Я сделал переопределить метод ________ и ожидал, что это повлияет на другие методы, такие как Iterkeys, ключевые ключи и т. Д., Поскольку я верил, что они называют __iter__ методом, чтобы получить значения, но, похоже, они реализуются независимо, и я должен переопределить все их.

Это ошибка или намерение, которые они не используют другие методы и извлекают значения отдельно?

Я не нашел в стандартной документации Python Description Callence зависимости между методами стандартных классов. Это будет удобно для работы по субасальной работе и на ориентацию, какие методы требуются для переопределения для правильного поведения. Есть ли дополнительная документация о базовых типах Python / классы внутренних органов?

Это было полезно?

Решение

Подкласс Mapping или MuteableMapping от Модуль коллекций вместо dict И вы получаете все эти методы бесплатно.

Вот пример минимального отображения и некоторые из методов, которые вы получаете бесплатно:

import collections
class MinimalMapping(collections.Mapping):
    def __init__(self, *items ):
        self.elements = dict(items)
    def __getitem__(self, key):
        return self.elements[key]
    def __len__(self):
        return len(self.elements)
    def __iter__(self):
        return iter(self.elements)

t = MinimalMapping()
print (t.iteritems, t.keys, t.itervalues, t.get)

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

Другие советы

Если не указано в документации, это Реализация конкретная. Отказ Реализации Другое, что CPYHON может повторно использовать iter метод реализации iterkeys и другие. Я бы не рассматривал это, чтобы быть ошибкой, но просто немного свободой для исполнителей.

Я подозреваю, что существует фактор производительности при внедрении методов самостоятельно, особенно как словари настолько широко используются в Python.

Так что в основном вы должны их реализовать.

Вы знаете поговорку: «Вы знаете, что происходит, когда вы предполагаете». :-)

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

Когда есть официальная документация специальных методов, она имеет тенденцию описать поведение переводчика относительно ваших собственных классов, таких как использование __len__() когда __nonzero__() не реализован или только нуждается __lt()__ для сортировки.

Поскольку Python использует стипендию утки, вам обычно не нужно наследовать встроенный класс, чтобы ваш собственный класс действовал как один. Так что вы могли бы пересмотреть ли подклассы dict действительно то, что вы хотите сделать. Вы можете выбрать другой класс, например, что-то из collections модуль или инкапсулировать, а не наследовать. (То UserString Класс использует инкапсуляцию.) Или просто начните с нуля.

Вместо подклассов dict, вы могли бы вместо этого просто создать свой собственный класс, который имеет точно Недвижимость, которые вы хотите без слишком больших проблем. Вот а блог пост на примере того, как это сделать. То __str__() Метод в нем не самый большой, но это легко исправлено, остальные обеспечивают функциональность, которые вы ищете.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top