问题描述
我知道 python 使用了鸭子类型,但我想知道是否可以对类变量强制执行类型验证,特别是 __slots__
。
例如 -
class Student:
def __init__(self,name):
self.name = name
class Class:
__slots__ = ('class_representative','var_2','var_3','...',# Assume many more variables below
)
def __init__(self,*args,**kwargs):
self.class_representative = kwargs.get('cr')
self.var_2 = kwargs.get('v2')
self.var_3 = kwargs.get('v3')
... # Assume many more variables below
在上面的例子中,我如何确保每当任何对象被分配给 class_representative
变量时,它应该始终是 Student
类型?
是否可能出现以下情况?
class Class:
__slots__ = ('class_representative': Student,# Assume many more variables below
)
解决方法
当您说“静态类型”时,我假设您指的是 PEP 484。在这种情况下,__slots__
完全没有区别,我们像通常对 Python 类所做的那样对实例变量的类型进行注释。
class Class:
__slots__ = ('class_representative',)
class_representative: Student
def __init__(self,student: Student) -> None:
self.class_representative = student
顺便说一下,如果您要在 Python 中进行静态类型检查(我强烈推荐它;这是一个设计精良的系统),在构造函数中获取和转发 *args
和 **kwargs
是一个失去任何静态可验证性的绝佳方式。获取您需要的参数,尽可能明确地提供类型,然后转发您必须提供的内容。