python中的`\uuu插槽`的静态类型
我知道python使用了duck类型,但我想知道是否有可能对类变量执行类型验证,尤其是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', '...
\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类从未指定它