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()
的相同实现,但具有 [=14] 的不同实现=],具有不同的 class 特定属性——所有这些 必须 在子 classes 中实现,否则会引发错误 TypeError: Can't instantiate abstract class ChildClass1 with abstract methods class_name
(例如,如果我尝试在没有 class_name
class 属性的情况下实现它)。
这几乎就是我想要的。但是我想知道是否有任何方法可以强制子 classes 具有 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()
,如果您有很多要为其强制执行类型的属性,这将变得笨拙。
我有一个基本的摘要 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()
的相同实现,但具有 [=14] 的不同实现=],具有不同的 class 特定属性——所有这些 必须 在子 classes 中实现,否则会引发错误 TypeError: Can't instantiate abstract class ChildClass1 with abstract methods class_name
(例如,如果我尝试在没有 class_name
class 属性的情况下实现它)。
这几乎就是我想要的。但是我想知道是否有任何方法可以强制子 classes 具有 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()
,如果您有很多要为其强制执行类型的属性,这将变得笨拙。