gpt4 book ai didi

python - 使用 python 类变量与实例变量

转载 作者:行者123 更新时间:2023-11-28 18:06:24 26 4
gpt4 key购买 nike

我是 python 新手。我正在尝试创建一个具有所需验证器的配置类。在下面的代码片段中,使用 python 类和类实例访问变量“a”会返回不同的值。这是一个正确的设计还是我应该只在类构造函数中初始化 var 'a' 并在 setter 方法中进行验证。

class IntField:
def __get__(self, instance, owner):
if instance is None:
return self
return instance.__dict__[self.name]

def __set__(self, instance, value):
if not isinstance(value, int):
raise ValueError('expecting integer')
instance.__dict__[self.name] = value

def __set_name__(self, owner, name):
self.name = name

class DefaultConfig:
a = IntField()

def __init__(self):
self.a = 2

print(DefaultConfig.a)
print(DefaultConfig().a)

输出:

<__main__.IntField object at 0x10c34b550>
2

最佳答案

I just want to know whether it's right way to do it

我会尽可能客观地征求意见,而不是征求意见。

只要处理了实例属性,您的代码就会按预期运行:

>>> c = DefaultConfig()
>>> c.a = 'foo'
Traceback (most recent call last):
File "<pyshell#88>", line 1, in <module>
c.a = 'foo'
File "<pyshell#83>", line 10, in __set__
raise ValueError('expecting integer')
ValueError: expecting integer
>>> c.a = 4
>>> c.a
4

检查 DefaultConfig.a 时,__get__ 函数仍与 instance=None 一起使用。因此,您可以选择 2 种可能的方式之一:

  • 保持透明并显示属性实际是什么(您当前在做什么)
  • 坚持描述符魔术并返回默认值(此处为 2)。

对于后一种方式,代码可以变成:

class IntField:
def __get__(self, instance, owner):
if instance is None:
return getattr(owner, '_default_' + self.name, self)
return instance.__dict__[self.name]

def __set__(self, instance, value):
if not isinstance(value, int):
raise ValueError('expecting integer')
instance.__dict__[self.name] = value

def __set_name__(self, owner, name):
self.name = name

class DefaultConfig:
a = IntField()
_default_a = 2
def __init__(self):
self.a = self._default_a

这里的技巧是按照约定,属性x 的默认值应该是_default_x

在这种情况下,您将获得:

print(DefaultConfig.a)
2

关于python - 使用 python 类变量与实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53208926/

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