Получение списка всех абстрактных базовых классов A Данный класс Python -- python поле с участием python-3.x пол Связанный проблема

Getting a list of all the abstract base classes a given Python class implements


3
vote

проблема

русский

Учитывая класс (в Python 3.8), как я могу получить список всех абстрактных базовых классов ИТ-реализацию? Например, учитывая <код> list , я ищу что-то, что вернутся <код> Container , <код> Iterable , <код> Collection , < код> Sized , <код> Sequence и т. д.

<Код> inspect.getmro() , <код> __mro__ и <код> __bases__ предоставит родительские классы, но они не включают в себя абстрактные базовые классы. Так что для list0 они предоставляют только <код> list1 (и <код> list2 сам для mRO).

<Код> list3 скажет, если объект реализует один один конкретный абстрактный базовый класс, но не список всех абстрактных базовых классов, которые он реализует.

Английский оригинал

Given a class (in Python 3.8), how can I get a list of all the abstract base classes it implments? For example, given list, I'm looking for something that would return Container, Iterable, Collection, Sized, Sequence, etc.

inspect.getmro(), __mro__, and __bases__ will provide the parent classes, but they do not include the abstract base classes. So for list they only provide object (and list itself for the mro ones).

isinstance will tell if an object implements one single specific abstract base class, but not a list of all abstract base classes it implements.

</div
     

Список ответов

2
 
vote

Вы можете использовать <код> collections.abc . По данным Python Docs

Этот модуль предоставляет абстрактные базовые классы, которые можно использовать для проверки того, имеет ли класс определенный интерфейс; Например, будь то хмарным или ли это сопоставлением.

link - https://docs.cython.org/3/Library /collctions.abc.html

 <код> In [22]: import collections.abc  In [23]: import inspect  In [31]: [(k,v) for k, v in vars(collections.abc).items() if inspect.isclass(v) and issubclass(list, v) ] Out[31]: [('Iterable', collections.abc.Iterable),  ('Reversible', collections.abc.Reversible),  ('Sized', collections.abc.Sized),  ('Container', collections.abc.Container),  ('Collection', collections.abc.Collection),  ('Sequence', collections.abc.Sequence),  ('MutableSequence', collections.abc.MutableSequence)]   
 

You can use collections.abc. According to python docs

This module provides abstract base classes that can be used to test whether a class provides a particular interface; for example, whether it is hashable or whether it is a mapping.

Link - https://docs.python.org/3/library/collections.abc.html

In [22]: import collections.abc  In [23]: import inspect  In [31]: [(k,v) for k, v in vars(collections.abc).items() if inspect.isclass(v) and issubclass(list, v) ] Out[31]: [('Iterable', collections.abc.Iterable),  ('Reversible', collections.abc.Reversible),  ('Sized', collections.abc.Sized),  ('Container', collections.abc.Container),  ('Collection', collections.abc.Collection),  ('Sequence', collections.abc.Sequence),  ('MutableSequence', collections.abc.MutableSequence)] 
</div
 
 
 
 
0
 
vote

Это невозможно из-за того, как Python обрабатывает уток, набрав в абстрактных базовых классах. Использование __subclasshook__ ABC может указать любую произвольную логику для определения того, является ли данный класс подклассом его. Например, из <код> __subclasshook__ documentation < / a>:

 <Код> class MyIterable(ABC):     # <snipped>     @classmethod     def __subclasshook__(cls, C):         if cls is MyIterable:             if any("__iter__" in B.__dict__ for B in C.__mro__):                 return True         return NotImplemented   

Этот код говорит, что класс <код> C представляет собой подкласс <код> MyIterable , если он содержит метод <код> __iter__ . Если у вас есть произвольный класс <код> X , который содержит <код> __iter__ это подкласс <код> MyIterable хотя бы <код> X никогда не распространяется Или даже знают о существовании <код> __subclasshook__ documentation0 . Следовательно, единственный способ обнаружить, если данный класс является подклассом набора абстрактных классов - проверять каждый из них, используя <код> __subclasshook__ documentation1 .

Учитывая, что «подмножество абстрактных базлей классов», которое вы хотите проверить, является набор всех абстрактных базовых классов, и, поскольку в мире может быть бесконечное количество произвольных абстрактных базовых классов, не удалось проверить их все.

Конечно, это Питон, где ничего не является действительно личным. Технически можно увидеть все классы, которые в настоящее время импортируются в ваш код путем рекурсирующего сканирования <код> __subclasshook__ documentation2 и тестирование против всех из них, используя <код> __subclasshook__ documentation3 , но я не могу Представьте, что это осуществимо в любой реальной программе.

 

This isn't possible because of the way Python handles duck typing in abstract base classes. Using __subclasshook__ an abc can specify any arbitrary logic to determine if a given class is a subclass of it. For example, from the__subclasshook__ documentation:

class MyIterable(ABC):     # <snipped>     @classmethod     def __subclasshook__(cls, C):         if cls is MyIterable:             if any("__iter__" in B.__dict__ for B in C.__mro__):                 return True         return NotImplemented 

This code says that the class C is a subclass of MyIterable if it contains the method __iter__. If you have an arbitrary class X that contains __iter__ it is a subclass of MyIterable even though X never expressly extends or is even aware of the existence of MyIterable. Therefore, the only way to discover if a given class is a subclass of a set of abstract classes is to check each of them using issubclass.

Given that the "subset of abstract bases classes" that you want to check is the set of all abstract base classes, and since there can be an infinite number of arbitrary abstract base classes in the world, it is not possible to test them all.

Of course, this is Python where nothing is truly private. It is technically possible to see all of the classes that are currently imported into your code by recursively scanning sys.modules, and testing against all of them using issubclass, but I can't imagine this being feasible in any real-world program.

</div
 
 

Связанный проблема

0  Использование Selenium Python при взаимодействии с веб-сайтом вручную  ( Using selenium python while interacting with a website manually ) 
Обновление: Я создал пользовательский профиль с совместимым способом IE в качестве по умолчанию и получить ту же сообщение об ошибке, поэтому кажется что-то о...

0  Питоновый способ Ифициализации булева  ( Pythonic way to initalize a boolean ) 
Это лучший / самый Pythonic способ инициализации логического значения для этой цели? <код> if start == today: b = date_time_obj <= start else: b = d...

5  Сайт к изображению  ( Website to image ) 
Я запускаю Python 3.1, и вы бы назвали меня продвинутым начинающим :) Мой вопрос простой: я пытаюсь сделать простую программу, которая просит пользователям ...

2  Tkinter приложение самого верхнее, даже над полноэкранным экраном  ( Tkinter application topmost even over fullscreen ) 
Я использую Tkinter на Ubuntu. Я хотел бы, чтобы мое приложение было на вершине экрана, все время. Я знаю, и в настоящее время использую, <код> wm_attribute...

0  Вызов частных методов для метода класса: Python  ( Calling private methods for class method python ) 
Я пытаюсь реализовать несколько конструкторов в Python, а одно из предложений (через онлайн-поиск) должен был использовать ClassMethod. Однако, используя это,...

0  Глобальное имя не работает в Python  ( Global name not working in python ) 
Я кодирую программу, где я использую Curses, чтобы создать пользовательский интерфейс, и я получил ширину и высоту терминала через другую команду, и я хочу сд...

1  Почему libleosa liblesa.feature.mfcc () выпрыгивает 2D массив?  ( Why does librosa librosa feature mfcc spit out a 2d array ) 
Вызов libleosa.feature.mfcc () в аудиофайле выплесет 2D-массив, как так: <код> array([[ -5.229e+02, -4.944e+02, ..., -5.229e+02, -5.229e+02], [ 7.105...

-1  Почему мои переменные выделены синим цветом? [закрыто]  ( Why are my variables highlighted in blue ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> закрыто. Этот вопрос не воспроизводится или был вызван опечаткам...

-2  Обменная переменная или бесплатная переменная?  ( Is num a bound variable or a free variable ) 
<код> def function() num = 1 num += 1 return num Обменивается связанная переменная или бесплатная переменная? P.S. Этот код написан в Python...

-3  Как публиковать данные в api api django  ( How to post data to django rest api ) 
У меня есть модель Django, которая выглядит как следующее: <код> [ { "ticker": "AAPL", "balance_sheet": [], "income_statement": ...

1  Не удалось не нулевое ограничение: attussaver_post.user_id  ( Not null constraint failed statussaver post user id ) 
Я пытаюсь сохранить данные пользователя через модельфу в Django. К сожалению, я наткнулся не против NULL CONSTRAINT: Statussaver_Post.user_id. Вот моя модель....

6  ReportLab 'LayoutError' Обработка и отладки  ( Reportlab layouterror handling and debugging ) 
Я работал с некоторыми сложными выходами PDF с ReportLab. Это, как правило, хорошо, но есть некоторые случаи, где я получаю LayoutErrors - это обычно потому, ...

1  Прочитайте текстовый файл и интерпретируйте данные  ( Read a text file and interpret the data ) 
Я должен написать программу, которая читает в текстовом файле, называемых «TESS.TXT», а затем сортирует файл и распечатывает его со ссылкой, с которой следует...

98  Подключение к серверу Microsoft SQL с помощью Python  ( Connecting to microsoft sql server using python ) 
<Р> Я пытаюсь подключиться к SQL через питон для запуска некоторых запросов на некоторых базах данных SQL на сервере Microsoft SQL. Из моих исследований в Инте...

-1  Ошибка Python OpenCV: (-215) Размер .Width> 0 && size.hight> 0 в функции imshow  ( Python opencv error 215 size width0 size height0 in function imshow ) 
Я запускаю эту программу, и это возвращает мне это сообщение об ошибке: Ошибка: (-215) Size.width & GT; 0 & AMP; & amp; Size.height & GT; 0 в функции imsho...




© 2021 www.qaru.top All Rights Reserved. Q&A House все права защищены


Licensed under cc by-sa 3.0 with attribution required.