gpt4 book ai didi

python - 如何强制/确保类属性是特定类型?

转载 作者:IT老高 更新时间:2023-10-28 21:47:21 26 4
gpt4 key购买 nike

如何将类成员变量限制为 Python 中的特定类型?


加长版:

我有一个类,它有几个在类外部设置的成员变量。由于它们的使用方式,它们必须是特定类型,int 或 list。

如果这是 C++,我只需将它们设为私有(private)并在“set”函数中进行类型检查。鉴于这是不可能的,有没有办法限制变量的类型,以便在为它们分配不正确类型的值时在运行时发生错误/异常?还是我需要在每个使用它们的函数中检查它们的类型?

最佳答案

您可以像其他答案所说的那样使用属性-所以,如果你想限制一个属性,比如“bar”,并将其限制为整数,您可以编写如下代码:

class Foo(object):
def _get_bar(self):
return self.__bar
def _set_bar(self, value):
if not isinstance(value, int):
raise TypeError("bar must be set to an integer")
self.__bar = value
bar = property(_get_bar, _set_bar)

这很有效:

>>> f = Foo()
>>> f.bar = 3
>>> f.bar
3
>>> f.bar = "three"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 6, in _set_bar
TypeError: bar must be set to an integer
>>>

(还有一种编写属性的新方法,使用内置的“属性”作为 getter 方法的装饰器 - 但我更喜欢旧方法,就像我在上面所说的那样)。

当然,如果您的类中有很多属性,并且想以这种方式保护所有属性,那么它就开始变得冗长了。无需担心 - Python 的自省(introspection)功能允许您创建一个类装饰器,该装饰器可以用最少的行数自动执行此操作。

def getter_setter_gen(name, type_):
def getter(self):
return getattr(self, "__" + name)
def setter(self, value):
if not isinstance(value, type_):
raise TypeError(f"{name} attribute must be set to an instance of {type_}")
setattr(self, "__" + name, value)
return property(getter, setter)

def auto_attr_check(cls):
new_dct = {}
for key, value in cls.__dict__.items():
if isinstance(value, type):
value = getter_setter_gen(key, value)
new_dct[key] = value
# Creates a new class, using the modified dictionary as the class dict:
return type(cls)(cls.__name__, cls.__bases__, new_dct)

您只需使用 auto_attr_check 作为类装饰器,并声明您希望类主体中的属性等于属性也需要约束的类型:

...     
... @auto_attr_check
... class Foo(object):
... bar = int
... baz = str
... bam = float
...
>>> f = Foo()
>>> f.bar = 5; f.baz = "hello"; f.bam = 5.0
>>> f.bar = "hello"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 6, in setter
TypeError: bar attribute must be set to an instance of <type 'int'>
>>> f.baz = 5
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 6, in setter
TypeError: baz attribute must be set to an instance of <type 'str'>
>>> f.bam = 3 + 2j
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 6, in setter
TypeError: bam attribute must be set to an instance of <type 'float'>
>>>


关于python - 如何强制/确保类属性是特定类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9305751/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com