Python:按值查找类的实例

时间:2018-11-23 16:04:28

标签: python oop

我创建了一个类的很多实例。然后,我想通过其名称查找一个实例。但是我收到错误消息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)

3 个答案:

答案 0 :(得分:4)

get方法属于实例,而不是类。一个类不知道它的实例(您可以可以做一些肮脏的技巧让该类知道,但不知道)。您需要的是实例列表。

一种可行的方式

  1. 覆盖等式运算符
  2. 创建实例列表

所以,类似

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_objReferencing 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")

但是,如果将方法修改为类方法,则它将无法访问实例属性,只有类属性才可见。 对于快速解决方案,我认为您应该将所有实例存储在数据结构中(例如,在列表中),然后可以创建一个函数,该函数将遍历实例并返回正确的实例。