我创建了很多类的实例。然后我想通过名称找到一个实例。但我收到错误消息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)
再次重读你的问题,我认为到目前为止我们所有人都没有抓住重点。您想要检查该类的所有实例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)
| 归档时间: |
|
| 查看次数: |
5111 次 |
| 最近记录: |