Как реализовать протокол как переменную экземпляра класса?Python

Программы на Python
Ответить
Anonymous
 Как реализовать протокол как переменную экземпляра класса?

Сообщение Anonymous »

У меня есть класс, у которого есть переменная-член, которой я хочу разрешить быть любым контейнером, реализующим несколько функций, которые я реализую с помощью приведенного ниже протокола:

Код: Выделить всё

class RandomAccessContainer(Protocol):
def append(self):
raise NotImplementedError("Container must implement append()")

def __getitem__(self, index):
raise NotImplementedError("Container must implement []")

def __len__(self):
raise NotImplementedError("Container must implement len()")
Конструктор этого класса создает пустую версию контейнера, удовлетворяющего этому протоколу, но я хочу, чтобы пользователь мог реализовать свой собственный контейнер, удовлетворяющий этому протоколу, и использовать его внутри класса. Я знаю, что могу объявить класс с помощью переменной типа, но как я могу позволить пользователю указать конкретный контейнер, который он хотел бы использовать при создании экземпляра класса? Мой конструктор такой:

Код: Выделить всё

class OfflinePacker[T: RandomAccessContainer] (ABC):
def __init__(self, varA: str, varB: str) -> None:
self.varA = varA
self.varB = varB

self.container = [] # I want this to be an empty container of user-specified type, so long as it satisfies the protocol
Один из подходов, который я мог бы использовать, — попросить пользователя передать конструктору пустой контейнер в качестве третьего параметра, но это кажется несколько неэлегантным. Это лучший вариант или есть другой способ сделать это?

Подробнее здесь: https://stackoverflow.com/questions/798 ... e-variable
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»