我创建了一个类的很多实例。然后,我想通过其名称查找一个实例。但是我收到错误消息TypeError: get() missing 1 required positional argument: 'value'
。
class Test(object):
def __init__(self, value):
self.value = value
def get(self, value):
if self.value == value:
return self
else:
return None
test_obj = Test('foobar')
print(test_obj.value)
instance = Test.get('foobar')
if instance:
print(instance.value)
答案 0 :(得分:4)
get
方法属于实例,而不是类。一个类不知道它的实例(您可以可以做一些肮脏的技巧让该类知道,但不知道)。您需要的是实例列表。
一种可行的方式
所以,类似
class Test:
def __eq__(self, value):
return self.value == value
test_list = [Test(5), Test(2), Test(3)]
position = test_list.index(2)
答案 1 :(得分:3)
再次阅读您的问题,我想到目前为止我们所有人都错过了重点。您想检查类Test
的所有实例,以查看实例的值是否为'foobar'
(在这种情况下,为test_obj
。Referencing this answer,您可以像所以:
class Test(object):
# class attribute to keep track of class instances
instances = []
def __init__(self, value):
self.value = value
Test.instances.append(self)
# class method to access the get method without any instance
@classmethod
def get(cls, value):
return [inst for inst in cls.instances if inst.value == value]
然后您可以创建多个测试:
test1 = Test(1)
test2 = Test(2)
test3 = Test(3)
instance = Test.get(3)
# [<__main__.Test object at 0x03F29CD0>]
instance[0].value
# 3
对于我来说,返回一个list
实例而不是一个实例是有意义的。但是,如果您只对第一个匹配感兴趣,则可以相应地修改return
语句。
原始答案:
instance = Test.get('foobar')
是问题所在。您是按Test
的类而不是其实例来引用。因此,实例方法.get(self, value)
自然会为该实例寻找第一个参数self
。
通常,如果您已经有一个实例(例如Test().get('foobar')
),则默认情况下该实例将以self
的形式传递到实例方法中。
您仍然可以调用实例方法,但是只需要在以下位置显式传递实例:
Test.get(test, 'foobar')
答案 2 :(得分:0)
您的类的“ get”方法不是类方法,因此您必须在实例上调用它:
test.get("foobar")
但是,如果将方法修改为类方法,则它将无法访问实例属性,只有类属性才可见。 对于快速解决方案,我认为您应该将所有实例存储在数据结构中(例如,在列表中),然后可以创建一个函数,该函数将遍历实例并返回正确的实例。