У меня есть общий класс Graph[Generic[T], object]
.
Мой вопрос, есть ли какая-нибудь функция, которая возвращает тип, переданный как общий класс Graph
>>> g = Graph[int]()
>>> magic_func(g)
<class 'int'>
У меня есть общий класс Graph[Generic[T], object]
.
Мой вопрос, есть ли какая-нибудь функция, которая возвращает тип, переданный как общий класс Graph
>>> g = Graph[int]()
>>> magic_func(g)
<class 'int'>
Вот один из способов добиться этого, который работает в Python 3.6+ (тестировался в 3.6, 3.7 и 3.8):
from typing import TypeVar, Generic
T = TypeVar('T')
class Graph(Generic[T], object):
def get_generic_type(self):
print(self.__orig_class__.__args__[0])
if __name__=='__main__':
g_int = Graph[int]()
g_str = Graph[str]()
g_int.get_generic_type()
g_str.get_generic_type()
Выход:
<class 'int'>
<class 'str'>
Если вы хотите, чтобы тип внутри __new__
или __init__
становился немного сложнее, см. Следующий пост для получения дополнительной информации: Базовый класс [T] - как получить тип T из экземпляра?
Изменить
Кажется, что библиотеки pytypes предоставляют метод, который позволяет получить orig_class даже из init, проверьте метод get_orig_class
, доступный здесь: https://github.com/Stewori/pytypes/blob/master/pytypes/type_util.py