如何在Python中通过实例的属性调用实例?

2024-10-05 21:56:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我定义了一个类,这个类中的对象有一些属性pp1pp2,等等

class example(object):
   def __init__(self,pp1,pp2,...):
       self.pp1=pp1
       self.pp2=pp2
       ...

for x in range (0,100):
    ll[x]=example(pp1[x],pp2[x],...) # pp1[x] pp2[x] are defined somewhere else

ll[30]=example(30.0,40.0,...)

我已经定义了类example的许多实例ll[x]。这些属性pp1、pp2等对于每个实例都是唯一的。你知道吗

通常,我们称之为:

ll[x].method()

如果我不知道实例的名称(在本例中是ll[x]),是否可以用实例的一个或多个属性来确定实例?例如,我希望调用一个实例,它的pp1是'30.0'(而pp2是40.0),但我不知道它的名称。(ll[30]在本例中)

在SQL中,它可能看起来像Select * from example where pp1=30.0 (and pp2=40.0),我们可以得到ll[30]作为它的结果,然后我们可以给.method()做其他事情。你知道吗

如果不可能的话,有没有别的办法?你知道吗

添加:
感谢Alik提出的使用过滤器的建议。我认为它可以适用于这个例子。但是如果我们不在列表中定义这些实例呢?你知道吗


Tags: 对象实例self名称属性定义objectexample
2条回答

这听起来像是熊猫数据帧的一个可能用途。如果您喜欢这个解决方案,我可以为您的类展示一个数据帧包装器的示例。这种方法的优点是,随着查询需求的增长,您可以使用pandas语法表示复杂的查询。你知道吗

import pandas as pd

ll = [i for i in range(0,100)]
for i in range(0,100):
    ll[i]=[i,i,i,i,i]
s = pd.DataFrame(ll,columns=['pp1','pp2','pp3','pp4','pp5'])

print s[s['pp1']==30]

简单的方法是在内部保存一个实例列表:

class example(object):
    instances = []

    def __init__(self, pp1, pp2, ...):
        self.pp1 = pp1
        self.pp2 = pp2
        ...

        example.instances.append(self)

然后,您只需过滤列表example.instances,即可找到所需的实例。你知道吗

或者,如果您希望采用性能更高的方法(具有更快的查找时间),则可以保留一个从每个属性值到具有该值的实例的查找表,如下所示:

class example(object):
    pp1_lookup = {}
    pp2_lookup = {}
    ...

    def __init__(self,pp1,pp2,...):
        self.pp1=pp1
        self.pp2=pp2
        ...

        example.pp1_lookup.setdefault(pp1,[]).append(self)
        example.pp2_lookup.setdefault(pp2,[]).append(self)
        ...

这种方法的缺点是它假定实例化后example实例是不可变的,并且属性值是可哈希的(否则它们不能用作dict键)。如果这两个都不是真的,事情就会变得更困难(但不是不可能)。你知道吗

要在此方案下查找实例,则只需在相应的查找表中查找属性值:

examples = example.pp1_lookup.get(30.0, [])

这将返回其pp130.0的所有example实例的列表。如果没有这样的实例,它将返回一个空列表。你知道吗

相关问题 更多 >