2017-02-21 30 views
2

如何在類中定義一個函數,使函數的返回類型是'當前類' - 而不是基類。例如:如何做一個返回自我與python pep484類型檢查的上層方法

Class Parent: 
    def set_common_properties_from_string(input : str) -> <WHAT SHOULD BE HERE> 
    # Do some stuff you want to do in all classes 
    return self 

Class Child(Parent): 
    pass 

    def from_file(filename : str) -> 'Child' 
     return Child().set_common_properties_from_string() # The return type of set_common must be Child 

還是應該有人投它?如果返回類型是基類,那麼它會給出錯誤。

我知道一個人可以把它放到兩條線上並添加臨時變量來保存Child(),但我認爲一個班輪更漂亮。

我使用mypy進行類型檢查。

+1

只是一種風格提示:後括號之前的空間使你的代碼的可讀性。 – MKesper

回答

0

您可以使用新實現的(並且仍然是實驗性的)generic self功能,該功能旨在幫助您準確解決遇到的問題。

Mypy支持從version 0.4.6開始的「通用自我」功能(注意:截至寫作時的最新版mypy爲0.470)。不幸的是,如果其他符合PEP 484標準的類型檢測器支持此功能,我不記得我的頭腦。

簡而言之,您需要做的是創建一個新的TypeVar,明確註釋您的self變量具有該類型,並且該TypeVar也是返回值。

所以你的情況,你需要修改代碼以下列:

from typing import TypeVar 

T = TypeVar('T', bound='Parent') 

class Parent: 
    def set_common_properties(self: T, input: str) -> T: 
     # Do some stuff you want to do in all classes 
     return self 

class Child(Parent): 
    def from_file(self, filename: str) -> 'Child': 
     # More code here 
     return Child().set_common_properties(...) 

請注意,我們需要設置我們的TypeVar由Parent類是有界的 - 這樣一來,內set_common_properties方法,我們可以調用生存在Parent內的任何其他方法。

你可以找到mypy的網站和內PEP 484多一點信息:

相關問題