Как Python обрабатывает универсальные сценарии типа / шаблонные сценарии типа? Скажите, что я хочу создать внешний файл "BinaryTree.py" и иметь его, обрабатывают двоичные деревья, но для любого типа данных.
Таким образом, я мог передать его тип пользовательского объекта и иметь двоичное дерево того объекта. Как это сделано в Python?
Если Вы использующий Python 2 или хотите переписать код Java. Их не действительное решение для этого. Вот то, что я получаю работу ночью: https://github.com/FlorianSteenbuck/python-generics я все еще не получаю компилятора так Вы в настоящее время использование его как этот:
class A(GenericObject):
def __init__(self, *args, **kwargs):
GenericObject.__init__(self, [
['b',extends,int],
['a',extends,str],
[0,extends,bool],
['T',extends,float]
], *args, **kwargs)
def _init(self, c, a, b):
print "success c="+str(c)+" a="+str(a)+" b="+str(b)
компилятор TODOs
<? extends List<Number>>
) super
, поддержка ?
поддержка На самом деле теперь можно использовать дженерики в Python 3.5 +. См. PEP-484 и документация библиотеки ввода .
Согласно моей практике это не является очень бесшовным и ясным специально для тех, кто знаком с Дженериками Java, но все еще применим.
После придумывающий некоторые хорошие мысли о создании универсальных типов в 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, чтобы сохранить различные формы внутреннего класса и возвратить предыдущий созданный внутренний класс, вместо того, чтобы создать новый. Это предотвратило бы дублирующиеся типы с теми же параметрами от того, чтобы быть созданным. Если заинтересовано, более изящное решение может быть сделано с декораторами и/или метаклассами.