不推荐使用类到字典属性python



在python中,我有一个类,它的属性之一是其他一些保存数据的类,比如:

class A:
class Params:
def __init__(self):
self.param1 = None
self.param2 = None
...
def __init__(self):
self.parameters = self.Params()

这样,如果有人想更改self.parameters中的某个参数,他可以编写self.parameters.param1 = ...

我想将保存参数的类Params更改为字典

class A:
def __init__(self):
self.parameters = {
'self.param1': None
'self.param2': None
}

这样,如果有人想更改任何内容,他可以改为编写self.parameters['param1'] = ...。我已经(在一个开发分支中(实现了这个更改,并且它是有效的。问题是其他人使用该代码,如果我做了这个更改,就会破坏他们的代码(这是一个简单的修复,但仍然如此(。

我想知道我是否有办法做到这一点,这样,如果有人用旧的方式(即parameters.param1 = ...(写作,它仍然可以工作,但在他这样做时打印一条DEPRECATED消息,这样我就可以创建一个过渡窗口,让人们从旧的方式转到新的方式。我想到的唯一方法是,如果我更改属性的名称,我可以保留旧代码并添加log.warning,但我不想更改属性名称,所以如果有人能想出一种方法来做到这一点,那就太好了:(

您可以定义使Params实现映射协议,然后在属性访问时产生弃用警告。

class Params:
def __init__(self):
...  # As before
def __setitem__(self, key, value):
# This check is optional, to prevent creating new attributes
if not hasattr(self, key):
raise ValueError(f"No such parameter {key}")
setattr(self, key, value)
__getitem__ = getattr
def __setattr__(self, attr, value):
warnings.warn("Don't set attributes directly", DeprecationWarning)
super().__setattr__(attr, value)
def __getattribute__(self, attr):
warnings.warn("Don't access attributes directly", DeprecationWarning)
super().__getattribute__(self, attr)

现在,您的下一个版本将支持这两种技术,但属性访问将引发警告。在之后的版本中,可以去掉Params类。

class A:
def __init__(self):
self.parameters = {
'param1': None
'param2': None
}

最新更新