gpt4 book ai didi

Python:使用装饰器来改变方法参数是一件坏事吗?

转载 作者:太空狗 更新时间:2023-10-30 02:57:49 27 4
gpt4 key购买 nike

我实现了一个装饰器来以这种方式改变类方法的参数:

def some_decorator(class_method):
def wrapper(self, *args, **kargs):
if self._current_view = self.WEAPON:
items = self._weapons
elif self._current_view = self.OTHER:
items = self._others
for item_id, item in items.iteritems():
class_method(self, item, *args, **kargs)
items_to_remove = []
for item_id, each_item in items.iteritems:
if each_item.out_dated():
item_to_remove.append(item_id)
for item_id in items_to_remove:
del items[item_id]
return wrapper

class SomeClass(object):
@some_decorator
def update_status(self, item, status):
item.update_status(status)

@some_decorator
def refresh(self, item):
item.refresh()

some_decorator 的主要目的是自动调用 SomeClass 的每个项目的方法,然后进行一些清理。由于可能有很多方法需要在项目上调用,所以我不想重复编写 for 循环和 clean_items 代码。

如果没有装饰器,SomeClass 会像这样:

class SomeClass(object):
def update_status(self, status):
if self._current_view = self.WEAPON:
items = self._weapons
elif self._current_view = self.OTHER:
items = self._others
for item_id, item in items.iteritems():
item.update_status(status)
items_to_remove = []
for item_id, each_item in items.iteritems:
if each_item.out_dated():
item_to_remove.append(item_id)
for item_id in items_to_remove:
del items[item_id]

@some_decorator
def refresh(self):
if self._current_view = self.WEAPON:
items = self._weapons
elif self._current_view = self.OTHER:
items = self._others
for item_id, item in items.iteritems():
item.refresh()
items_to_remove = []
for item_id, each_item in items.iteritems:
if each_item.out_dated():
item_to_remove.append(item_id)
for item_id in items_to_remove:
del items[item_id]

当我实际使用这些方法时,我会这样做:

a = SomeClass()
a.update_status(1)
a.refresh()

问题来了,我传给update_status的参数和update_status声明的参数不一样,item漏掉了since 由 some_decorator 自动传递。我想知道这是否是一件坏事,因为当其他程序员看到它时可能会引起混淆。

如果它确实是一个非常糟糕的模式,是否有任何其他模式可以为我做同样的事情而不会引起混淆?

最佳答案

我认为即使是无聊的模块级函数在这里也是一个不错的选择。看起来您的类实例发生的这些操作根本没有任何充分的理由作为类方法“属于”该类。

def update_status(some_item_haver, new_status):
for item in some_item_haver.items:
item.update_status(new_status)

现在,它可以与许多不同的类一起使用,即使是那些使用装饰器修改其方法是不明智的痛苦的类,例如来自其他人编写的库的第三方类。

a = SomeClass()
b = SomeChildOfA()
c = SomeThirdPartyThingAlsoWithItems()

update_status(a, "beep")
update_status(b, "bop")
update_status(c, "Vote for Bernie Sanders!")

更新后编辑

class SomeClass(object):
# __init__ and other stuff
#...

def helper(self, func, *args, **kwargs):
if self._current_view == self.WEAPON:
items = self._weapons
elif self._current_view == self.OTHER:
items = self._others


# The abstract part
for item_id, item in items.iteritems():
getattr(item, func)(*args, **kwargs)


items_to_remove = []
for item_id, each_item in items.iteritems:
if each_item.out_dated():
item_to_remove.append(item_id)
for item_id in items_to_remove:
del items[item_id]


def update_status(self, status):
self.helper('update_status', status)

def refresh(self):
self.helper('refresh')

关于Python:使用装饰器来改变方法参数是一件坏事吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35882219/

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