簡體   English   中英

Python:如何使用所有大寫命名約定和 linter 警告創建抽象類屬性

[英]Python: how to make abstract class attribute, with all caps naming convention and linter warnings

我有一個抽象基類,具有一個常量類屬性。

如何強制子類覆蓋它?

我想保留常量的全部大寫 PEP8 約定


示例代碼

from abc import ABC


class BaseClass(ABC):
    """Some abstract base class."""

    # How do I force children to override this?
    CONST_CLASS_ATTR = "base"


class ChildClass(BaseClass):
    """Child class."""

    CONST_CLASS_ATTR = "child"


潛在的解決方案

這里已經有一個非常相似的問題: Python 中的抽象屬性

但是,所有答案似乎都是解決方法。 我想知道,有沒有更簡單的方法?

答案: https : //stackoverflow.com/a/58321197/11163122

指示使用兩個裝飾器: abstractmethod + property

  • 優點:Linter 會通知我子類是否沒有實現CONST_CLASS_ATTR ,並且由於它是抽象的而無法在運行時實例化
  • 缺點: Linter ( pylint ) 現在抱怨invalid-name ,我想保持常量的所有大寫命名約定
from abc import ABC, abstractmethod


class AnotherBaseClass(ABC):
    """Some abstract base class."""

    @abstractmethod
    @property
    def CONST_CLASS_ATTR(self) -> str:
        return "base"


class AnotherChildClass(AnotherBaseClass):
    """Child class."""

    @property
    def CONST_CLASS_ATTR(self) -> str:
        return "child"

答案: https : //stackoverflow.com/a/55544173/11163122

指示使用 dunder 方法__init_subclass__ 這更好,因為我的 linter 不再抱怨,但它不那么明顯。

  • 優點:Linter 不再抱怨invalid-name ,並且由於引發NotImplementedError無法在運行時實例化
  • 缺點:如果子類沒有實現CONST_CLASS_ATTR不再發出警告。 另外,這對我來說似乎很冗長
from abc import ABC


class YetAnotherBaseClass(ABC):
    """Some abstract base class."""

    CONST_CLASS_ATTR: str

    @classmethod
    def __init_subclass__(cls):
        if not hasattr(cls, 'CONST_CLASS_ATTR'):
            raise NotImplementedError(
                f"Class {cls} lacks required CONST_CLASS_ATTR class attribute.")


class YetAnotherChildClass(YetAnotherBaseClass):
    """Child class."""

    CONST_CLASS_ATTR = "child"

我正在使用 Python 3.6

我認為屬性裝飾器方法是最干凈的。 只是沉默pylint:

@abstractmethod
@property
def CONST_CLASS_ATTR(self) -> str:  # pylint: disable=invalid-name
    return "base"

這只會使針對此特定方法及其覆蓋的警告靜音。

暫無
暫無

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

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