假設我想實作我的自定義list類,我想覆寫__getitem__,這樣item引數就可以用默認的None進行初始化,并有相應的行為:
class CustomList(list)。
def __init__(self, iterable, default_index)。
self.default_index = default_index
super().__init__(iterable)
def __getitem__(self, item=None)。
if item is None:
專案 = self._default_index
return super().__getitem__(item)
iterable = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
my_list = CustomList(iterable, 2)
這允許my_list[None],但是如果像my_list[]這樣固有地使用默認的引數,那就太棒了。
不幸的是,這引發了SyntaxError,所以我假設該陳述句在語法層面是非法的...我的問題是。為什么?它是否會與其他一些陳述句相沖突?
我非常好奇,為什么會這樣?
我對這個問題非常好奇,所以非常感謝任何愿意解釋的人!
uj5u.com熱心網友回復:
它在語法上沒有用。沒有一個有用的方法可以在程式上使用my_list[],而不需要將它硬編碼。一段代碼不可能在串列參考中有時有一個變數,有時沒有。在這種情況下,為什么不直接設定一個不同的屬性來獲取默認值呢?
@property
def default(self)。
return super().__getitem__(self.default)
@property.setter[/span]。
def default(self, val)。
super().__setitem__(self.default, val)
object.__getitem__(self, val)被定義為有一個必需的位置引數。Python 是動態的,所以你可以改變這個呼叫簽名,但這并不能改變所有其他代碼對它的使用。
所有的Python運算子背后都有一個神奇的方法,而這個神奇的方法總是能比運算子暴露出更多的特性。為什么不讓 有一個默認值?因此,a = b 將是合法的。再說一次,這在語法上是沒有用的--如果你想這么做,你可以直接暴露一個函式。
uj5u.com熱心網友回復:
__getitem__總是精確地接受一個引數。你可以傳遞多個引數,但這實際上只是將其轉換為一個元組:
__getitem__總是需要一個引數。
>>> a = [] 。
>>> a[1, 2]
回溯(最近一次呼叫)。
檔案"<stdin>",行1,in<module>。
TypeError: list索引必須是整數或片,不是tuple。
注意錯誤資訊中的 "不是元組"
。轉載請註明出處,本文鏈接:https://www.uj5u.com/net/325367.html
標籤:
