日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

python装饰器类型错误_有没有办法在继承期间保持装饰器? - python

發布時間:2025/3/20 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。