我想構建一個遞回型別的類,其中該類是一個包括自身在內的事物串列。如何做到這一點?即使使用from __future__ import annotations.
from __future__ import annotations
from typing import Union, List
class A:
pass
class AList(List[Union[A, AList]]):
pass
這樣做的目的是各種內置的方法占據優勢list,例如append,extend,__iter__等,同時還可以添加自定義的方法。
可以簡單地將list. 它是否添加了任何內容來指定我將在 AList 中通過的型別元素List[Union[A, AList]]?
uj5u.com熱心網友回復:
以下語法:
class AList(List[Union[A, AList]]):
我不認為這是你想要做的。它基本上說該類AList是list.
我認為這樣的事情就是你想要的。這應該適用于包含__future__匯入的Python 3.7 ,盡管我不確定如何mypy處理它(至少在 Pycharm 上看起來不錯)
from __future__ import annotations
from dataclasses import dataclass
class A:
...
@dataclass
class AList:
data: list[A | AList]
@staticmethod
def my_custom_method():
print('Hello world!')
# creating instance of A
a = A()
# does not type check
my_list = AList(a)
my_list = AList([1, 2])
# type checks
my_list1 = AList([a])
my_list2 = AList([my_list1])
# True
assert my_list1.data[0] == a
assert my_list2.data[0] == my_list1
print(my_list1)
print(my_list2)
my_list2.my_custom_method()
# Hello world!
從串列子類化
請注意,您可以從上面的例子通過仍然可以訪問串列物件data的屬性,它應該支持這樣的串列操作append,并extend為例子。
如果您確實打算從 子類化list,則以下方法應該可以作業,并且在 Pycharm 中也可以很好地作業,例如。
請注意,我在__future__此處洗掉了匯入,因為實際上不需要它;因為A | AList在這種情況下注釋已經預先宣告為字串。
from typing import List
class A:
...
class AList(List['A | AList']):
def first_element(self):
return self[0]
# creating instance of A
a = A()
# does not type check
my_list = AList(["testing"])
my_list = AList([1, 2])
# type checks
my_list1 = AList([a])
my_list2 = AList([my_list1])
# True
assert my_list1[0] == a
assert my_list2[0] == my_list1
print(my_list1)
print(my_list2)
elem = my_list2.first_element()
print(elem)
# [<__main__.A object at 0x103809750>]
# True
assert isinstance(elem, AList)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/328535.html
