python中的`\uuu插槽`的静态类型

python中的`\uuu插槽`的静态类型,python,slots,Python,Slots,我知道python使用了duck类型,但我想知道是否有可能对类变量执行类型验证,尤其是\uuuuu\uuuu 比如说- class Student: def __init__(self, name): self.name = name class Class: __slots__ = ('class_representative', 'var_2', 'var_3', '...

我知道python使用了duck类型,但我想知道是否有可能对类变量执行类型验证,尤其是
\uuuuu\uuuu

比如说-

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\u representative
变量,它都应该是
Student
类型

有可能出现以下情况吗

class Class:
    __slots__ = ('class_representative': Student,
                 'var_2',
                 'var_3',
                 '...',  # Assume many more variables below
                )
当你说“静态输入”时,我想你指的是。在这种情况下,
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
完全没有区别,我们对实例变量的类型进行了注释,就像我们对Python类所做的那样

class Class:
    __slots__ = ('class_representative',)
    class_representative: Student

    def __init__(self, student: Student) -> None:
        self.class_representative = student

顺便说一句,如果您打算在Python中进行静态类型检查(我强烈推荐;这是一个设计得出奇地好的系统),那么在构造函数中获取并转发
*args
**kwargs
是丢失任何静态可验证性的极好方法。获取所需的参数,尽可能提供明确的类型,并转发所需的参数。

您必须自己编写代码来实现这一点。。。不确定
\uuuuu slots\uuuuuu
的相关性是什么?您是否询问静态键入检查,以确保属性仅获取
学生值,还是运行时检查?@Blckknght我想阻止在程序执行生命周期的任何时候将
Student
以外的任何类型分配给
class\u representative
变量。@aaryan:这并没有真正回答我的问题。静态类型检查发生在您运行程序之前,旨在证明您从未使用错误的类型调用函数。程序运行时进行运行时检查。它们的实现方式完全不同,因此您确实需要选择您想要的一个并执行该操作<代码>\uuuu插槽\uuuuu
与类型检查(任何一种)无关。它的目的是通过避免在每个实例中使用
\uuu dict\uuu
来帮助您为要创建的大量对象节省内存。@Blckknght很抱歉之前没有正确理解您的问题。是的,我想在这里进行静态类型检查。有一种方法,西尔维奥·马约洛(Silvio Mayolo)在下面给出了答案,但它不适用于*args/**kwargs语法。有关更多详细信息,请参见我的评论。在某些地方,我有很多参数要传递给构造函数。如果我按照你建议的方式写论点,那就很难看了。因此,我使用的是
**kwargs
,但这样我就失去了静态可验证性。所以我想知道是否有一种方法可以以某种方式在
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
中指定它们。@aaryan:我不确定
**kwargs
的作用是否与你想象的一样。在示例代码中,您的
\uuuu init\uuu
方法与根本没有方法相同。如果不实现
\uuuuu init\uuuuu
,则将继承
对象。\uuuuu init\uuuu
,该对象不接受除
self
以外的任何参数,并且不执行任何操作。您的代码接受任意参数,但将它们传递给
对象。\uuuu init\uuuu
,如果存在任何参数(任何类型),则会引发异常。您的类中没有任何内容会基于
args
kwargs
中的任何参数设置
class\u representative
,因此我不确定您要键入什么检查。@Blckknght我改进了相关示例,使其更容易理解问题。我仍然同意@Blckknght。如果要将实例变量
class\u representative
设置为参数
cr
,则只需使用名为
cr
的参数即可
**kwargs
用于将所有关键字参数作为字典接受的情况。如果你知道需要什么样的参数,那么这完全是毫无意义的,并且会牺牲你的静态可验证性。另外,值得指出的是,只是为了确保没有误解<代码>\uuuu插槽\uuuu主要是一种使类大小更小的效率技巧。对于Python中的类来说,这绝对不是必需的。因此,除非这个类在极端的瓶颈情况下使用(并且您已经对它进行了基准测试并发现了这方面的证据),否则
\uuuuuu slots\uuuu
可能还为时过早。特别是,类中不需要它,绝大多数Python类从未指定它