[英]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
CONST_CLASS_ATTR
,並且由於它是抽象的而無法在運行時實例化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 不再抱怨,但它不那么明顯。
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.