После того, как я придумал несколько хороших мыслей о создании универсальных типов в python, я начал искать тех, у кого была такая же идея, но я не смог ее найти.Итак, вот оно.Я попробовал это, и это работает хорошо.Это позволяет нам параметризировать наши типы в python.
class List( type ):
def __new__( type_ref, member_type ):
class List( list ):
def append( self, member ):
if not isinstance( member, member_type ):
raise TypeError( 'Attempted to append a "{0}" to a "{1}" which only takes a "{2}"'.format(
type( member ).__name__,
type( self ).__name__,
member_type.__name__ ) )
list.append( self, member )
return List
Теперь вы можете получать типы из этого универсального типа.
class TestMember:
pass
class TestList( List( TestMember ) ):
def __init__( self ):
super().__init__()
test_list = TestList()
test_list.append( TestMember() )
test_list.append( 'test' ) # This line will raise an exception
Это решение упрощено и имеет свои ограничения.Каждый раз, когда вы создаете универсальный тип, он создает новый тип.Таким образом, несколько классов, наследующих List( str )
в качестве родителя, будут наследоваться от двух отдельных классов.Чтобы преодолеть это, вам нужно создать dict для хранения различных форм внутреннего класса и вернуть ранее созданный внутренний класс, а не создавать новый.Это предотвратит создание дубликатов типов с одинаковыми параметрами.Если интересно, более элегантное решение может быть сделано с помощью декораторов и / или метаклассов.