Python:按值查找类的实例

ikr*_*reb 1 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)
Run Code Online (Sandbox Code Playgroud)

r.o*_*ook 5

再次重读你的问题,我认为到目前为止我们所有人都没有抓住重点。您想要检查该类的所有实例Test以查看某个实例是否具有该值'foobar'(在本例中为test_obj引用此答案,您可以像这样修改代码:

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]
Run Code Online (Sandbox Code Playgroud)

然后您可以创建多个测试:

test1 = Test(1)
test2 = Test(2)
test3 = Test(3)

instance = Test.get(3)
# [<__main__.Test object at 0x03F29CD0>]

instance[0].value
# 3
Run Code Online (Sandbox Code Playgroud)

对我来说,返回一list组实例而不是一个实例是有意义的。但是,如果您只对第一个匹配项感兴趣,则可以return相应地修改该语句。


原答案:

instance = Test.get('foobar')是问题所在。您是Test通过其类而不是其实例来引用的。因此,实例方法自然.get(self, value)会寻找self实例的第一个参数。

通常,如果您已经有一个实例(例如Test().get('foobar')),则默认情况下该实例会传递到实例方法中self

您仍然可以调用实例方法,但只需显式传入实例即可:

Test.get(test, 'foobar')
Run Code Online (Sandbox Code Playgroud)