【发布时间】:2009-11-19 14:07:29
【问题描述】:
(以下是与python3相关的(如果有的话)。)
这是我编写的代码(简化):
class MyClass: def __init__(self): self.__some_var = [] @property def some_var(self): return self.__some__var @some_var.setter def some_var(self, new_value): if hasattr(new_value, '__iter__'): self.__some_var = new_value else: self.__some_var.append(new_value)
我想在设置它们是否是多个“值”时替换(即,如果 new_value 是可迭代的,在我的情况下,是不可迭代的对象)并且如果它们只是一个“值”则追加。 我担心 hasattr 的性能,所以我想知道我是否不应该使用这个 setter:
@some_var.setter def some_var(self, *args): if len(args) > 1: self.__some_var = args else: self.__some_var.append(args)
感谢您的关注!
【问题讨论】:
-
过早的优化有人吗?做一个简单的基准测试,看看差异是否可以测量。如果有的话,我希望
hasattr更快。 -
@thomas,在您的第一种形式中,您是否确定当
new_value是"thomas"时要“替换”?字符串有__iter__,并且是序列,但在代码中几乎总是我们希望将它们视为标量。 (当然,第二种形式的语义完全不同,因此它总是会“替换”,即使使用列表调用也是如此)。 -
事实上,如果 new_value 的 values() 元素有一些方法,它们只是在做作之前的一个测试,你可以将特定行为的对象传递给这个函数,否则会引发错误。
标签: python