簡體   English   中英

Python 檢查繼承摘要中的屬性類型 class

[英]Python check attribute type in inherited abstract class

我有一個基本的抽象 class 結構,如下所示:

from abc import ABCMeta, abstractmethod

class BaseClass(metaclass=ABCMeta):
   @property
   @abstractmethod
   def class_name(self):
       pass

   @property
   @abstractmethod
   def class_val(self):
       pass

   @abstractmethod
   def foo(self):
       pass

   def bar(self):
       # do something


class ChildClass1(BaseClass):
    class_name = "Child1"
    class_val = 1

    def foo(self):
        # do something else


class ChildClass2(BaseClass):
    class_name = "Child2"
    class_val = 2

    def foo(self):
        # do something else again

這基本上可以做我想做的事,即,它讓我定義一個基類 class 的變體,它們共享方法bar()的相同實現,但具有不同的foo()實現,具有不同的類特定屬性——所有必須在子類中實現,否則會引發錯誤TypeError: Can't instantiate abstract class ChildClass1 with abstract methods class_name (例如,如果我嘗試在沒有class_name class 屬性的情況下實現它)。

這幾乎就是我想要的。 但是我想知道是否有任何方法可以強制子類的class_name屬性具有字符串類型, class_val屬性具有int類型等?

最好的辦法是使用類型提示,然后使用第三方工具(如mypy )驗證類型提示:

class BaseClass(metaclass=ABCMeta):
   @property
   @abstractmethod
   def class_name(self) -> str:
       pass

   @property
   @abstractmethod
   def class_val(self) -> int:
       pass

   @abstractmethod
   def foo(self):
       pass

   def bar(self):
       pass

如果您嘗試為屬性定義錯誤類型的子類, mypy將拋出錯誤,例如:

class ChildClass2(BaseClass):
    class_name = "Child2"
    class_val = "a"

    def foo(self):
        pass

你會得到如下錯誤:

test.py: error: Incompatible types in assignment
(expression has type "str", base class "BaseClass" defined the type as "int")

這在技術上不會阻止某人定義具有錯誤類型的子類,因為 Python 運行時會忽略類型提示。 但是,如果遇到錯誤類型則引發錯誤的方法可能需要為每個實例變量調用isinstance() ,如果您有許多要為其強制執行類型的屬性,這將變得笨拙。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM