无法清楚地理解为实体创建CRUD界面的正确方法
例如:
我有变量date
,place
和name
的实体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。
答案 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