【发布时间】:2019-02-03 22:43:43
【问题描述】:
我正在尝试编写一个简单的类,该类填充一些列表,然后尝试检索该信息,例如:
class Foo(object):
def __init__(self):
self.src = []
self.values = []
def addItems(self, name, val):
self.src.append(name)
self.values.append(val)
def getItem(self, item):
for i, x in enumerate(self.src):
if x == item:
return self.src[i], self.values[i]
要使用这个类,我首先必须实例化它,Foo(),然后才开始添加和检索对象。
a = Foo()
a.addItems('A', '1')
a.addItems('B', '2')
a.src # ['A', 'B']
a.values # ['1', '2']
a.getItem('A') # ('A', '1')
有什么方法可以添加元素而不必先初始化类?类似于Foo.addItems('A', '1')(这给出了TypeError: addItems() missing 1 required positional argument: 'val')。
我看到其他使用 @staticmethod 的相关帖子,但无法弄清楚如何在此示例中使其工作。
【问题讨论】:
-
你试图不实例化一个类的实际目的是什么?
-
这个类应该作为一个更大程序的一部分被多次使用,所以我想不必每次调用都实例化它是有利的,例如避免这些重复:
x = Foo() ... y = Foo() ... z = Foo() -
如果您必须以类似的方式多次重复实例化类,您应该使用循环将它们实例化为 dict 或对象列表。
-
我明白了,这可能是一种选择,但不是让主程序更复杂,而是想知道这是否可以在类级别本身更好地完成。而且我猜它每次都需要分配:
x = list_holding_instantiated_class[0] ... y = list_holding_instantiated_class[1]。 -
不,实例旨在完全满足您的需求。试图在不实际创建实例的情况下管理类的不同实例的属性值违背了类的目的。
标签: python python-3.x class methods