【发布时间】:2021-03-28 04:21:13
【问题描述】:
我知道 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,
'var_2',
'var_3',
'...', # Assume many more variables below
)
【问题讨论】:
-
您必须自己编写代码来强制执行...不确定
__slots__的相关性是什么 -
您是在询问静态类型检查以确保属性仅获取
Student值,还是运行时检查? -
@Blckknght 我想防止在程序执行的任何时候将除
Student之外的任何其他类型分配给class_representative变量。 -
@aaryan:这并没有真正回答我的问题。静态类型检查发生在您运行程序之前,并试图证明您从未使用错误类型调用函数。运行时检查发生在程序运行时。它们的实现方式完全不同,所以你真的需要选择你想要的并做那件事。
__slots__与类型检查(任何一种)无关。它的目的是通过避免在每个实例中都需要__dict__来帮助您为要创建大量对象的对象节省内存。 -
@Blckknght 很抱歉之前没有正确理解您的问题。是的,我想在这里进行静态类型检查。
Silvio Mayolo在下面回答了一种方法,但它不适用于 *args/**kwargs 语法。有关详细信息,请参阅我的评论。