python中`__slots__`的静态类型

问题描述

我知道 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 是一个失去任何静态可验证性的绝佳方式。获取您需要的参数,尽可能明确地提供类型,然后转发您必须提供的内容。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...