什么是更新自定义对象变量列表的pythonic方法?

时间:2018-01-26 15:23:15

标签: python

无法清楚地理解为实体创建CRUD界面的正确方法 例如: 我有变量dateplacename的实体class Event: def __init__(self, date=None, name=None, place=None): self.date = date self.name = name self.place = place 。 我已经为这个实体提供了默认(nullablle)值的基本构造函数。

update_event(**kwargs)

尝试找出为此实体创建更新处理程序的pythonic方法,这允许我更新自定义数量的实体字段(例如::更新名称和地点,而不指定日期)。

我怎么看这个:
**kwargs等更新方法中使用自定义属性列表,然后解析.hasattr()列表,并使用.getattr()def update_event(self, **kwargs): for key, value in kwargs.items(): self.__setattr__(key, value) return self 函数将它们与实体匹配。
它似乎有效(并且能够找到实体之间的实际差异,这也很有用),但看起来非常苛刻 设置kwargs中所有值的基本版本如下所示:

def update_event(self, **kwargs):
    for key, value in kwargs.items():
        if self.__getattribute__(key) != value:
            # We got diff
            self.__setattr__(key, value)
        else:
            # We got same value stored already
    return self 

如果我们需要检查是否有差异,我们已经得到:

__setattr__

也许我错过了一些东西,并且有更优雅和简单的解决方案来解决这个问题,或者寻找一些设计模式?

Tnx的答案和抱歉的虚假问题。

UPD :我看到另外一点:简单**kwargs不检查此类变量是否存在。因此,如果.hasattr()包含无效的参数名称,则会出现属性错误 显而易见的解决方法是创建None的检查,但正如我所看到的,如果声明变量但它具有eigs值,它将返回False。

2 个答案:

答案 0 :(得分:1)

查看此文档link 尝试以这种方式使用它,我可能是错的,但我认为它更好。

def update_event(self, **kwargs):
    for key, value in kwargs.items():
        setattr(self, key, value)
    return self

答案 1 :(得分:0)

要检查您是否只覆盖现有属性:

def update_event(self, **kwargs):
    for key, value in kwargs.items():
        if hasattr(self, key):
            setattr(self, key, value)
    return self

def __repr__(self):
    return 'Event: ' + str(self.date)

f=Event()
print(f)
f.update_event(date=1)
print(f)

输出:

Event: None
Event: 1