python装饰器类型错误_有没有办法在继承期间保持装饰器? - python
我正在嘗試使用未實現的方法編寫一個抽象類,這將迫使繼承的子代在重寫該方法(在裝飾器中定義)時返回特定類型的值。
當我使用下面顯示的代碼時,子方法不會調用裝飾器。我認為這是因為該方法被重寫了,這很有意義。我的問題基本上是這樣的:
有沒有辦法使裝飾器通過方法重寫持久化?
我不反對使用除裝飾器以外的其他方法,但這是一個迅速浮現在腦海中的解決方案,我想知道是否有任何方法可以使其工作。
如果選擇裝飾器是正確且可能的選擇,它將看起來像這樣:
def decorator(returntype):
def real_decorator(function):
def wrapper(*args, **kwargs):
result = function(*args, **kwargs)
if not type(result) == returntype:
raise TypeError("Method must return {0}".format(returntype))
else:
return result
return wrapper
return real_decorator
我需要我的父類看上去與此類相似:
class Parent(ABC):
@decorator(int)
@abstractmethod
def aye(self, a):
raise NotImplementedError
子類將執行以下操作:
class Child(Parent):
def aye(self, a):
return a
如果需要,我將很樂意更好地闡明我的問題,并感謝所有花時間提前閱讀此問題的人!
參考方案
我不確定您能否以所需的方式持久保留裝飾器的效果,但是您仍然可以在Parent類(不是abstractmethod)中裝飾包裝函數,并讓子類實現包裝的函數像那樣 :
from abc import ABC, abstractmethod
def decorator(returntype):
def real_decorator(function):
def wrapper(*args, **kwargs):
result = function(*args, **kwargs)
if not type(result) == returntype:
raise TypeError("Method must return {0}".format(returntype))
else:
return result
return wrapper
return real_decorator
class Parent(ABC):
@decorator(int)
def aye(self, a):
return self.impl_aye(a)
@abstractmethod
def impl_aye(self, a):
raise NotImplementedError
class Child(Parent):
def impl_aye(self, a):
return a
還有一些解決方案可以保護aye方法,以防Parent類在需要時被覆蓋,例如,請參見this answer。
否則,如果您想使用type hints并使用mypy(Python的可選靜態類型檢查器)檢查代碼,并且嘗試實現返回類型與其父類不兼容的子類,則會收到錯誤消息:
from abc import ABC, abstractmethod
class Parent(ABC):
@abstractmethod
def aye(self, a) -> int:
raise NotImplementedError
class Child(Parent):
def aye(self, a) -> str :
return a
mypy的輸出:
a.py:9: error: Return type "str" of "aye" incompatible with return type "int" in supertype "Parent"
Found 1 error in 1 file (checked 1 source file)
Python sqlite3數據庫已鎖定 - python
我在Windows上使用Python 3和sqlite3。我正在開發一個使用數據庫存儲聯系人的小型應用程序。我注意到,如果應用程序被強制關閉(通過錯誤或通過任務管理器結束),則會收到sqlite3錯誤(sqlite3.OperationalError:數據庫已鎖定)。我想這是因為在應用程序關閉之前,我沒有正確關閉數據庫連接。我已經試過了: connectio…Python Pandas導出數據 - python
我正在使用python pandas處理一些數據。我已使用以下代碼將數據導出到excel文件。writer = pd.ExcelWriter('Data.xlsx'); wrong_data.to_excel(writer,"Names which are wrong", index = False); writer.…Python:集群作業管理 - python
我在具有兩個階段的計算群集(Slurm)上運行python腳本,它們是順序的。我編寫了兩個python腳本,一個用于階段1,另一個用于階段2。每天早上,我檢查所有第1階段的工作是否都以視覺方式完成。只有這樣,我才開始第二階段。通過在單個python腳本中組合所有階段和作業管理,是否有一種更優雅/自動化的方法?我如何知道工作是否完成?工作流程類似于以下內容:w…Python:在不更改段落順序的情況下在文件的每個段落中反向單詞? - python
我想通過反轉text_in.txt文件中的單詞來生成text_out.txt文件,如下所示:text_in.txt具有兩段,如下所示:Hello world, I am Here. I am eighteen years old. text_out.txt應該是這樣的:Here. am I world, Hello old. years eighteen a…用大寫字母拆分字符串,但忽略AAA Python Regex - python
我的正則表達式:vendor = "MyNameIsJoe. I'mWorkerInAAAinc." ven = re.split(r'(?<=[a-z])[A-Z]|[A-Z](?=[a-z])', vendor) 以大寫字母分割字符串,例如:'我的名字是喬。 I'mWorkerInAAAinc”變成…
總結
以上是生活随笔為你收集整理的python装饰器类型错误_有没有办法在继承期间保持装饰器? - python的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: channelread0会被调用两次_值
- 下一篇: dubbo provider异步_Dub