首页 > 解决方案 > 使用满足多个条件的类的实例而不使用列表

问题描述

我想知道如何找到满足某些条件的类的实例并在不应用 python 列表的情况下使用它们。

class d1():
    def __init__(self,a,b):
        self.a=a
        self.b=b
f0=d1(2,1)
f1=d1(2,3)
f2=d1(2,4)
f3=d1(4,4)

在这种情况下,我想找到具有a==2and b<4( f0and f1) 的实例并在不应用 python 列表的情况下使用它们。我想知道在没有像 python 列表这样的存储桶的其他语言中如何处理它们。

所以有2个问题:

  1. 多条件实例查找
  2. 在不使用 python 列表的情况下处理对象。

Python 列表是动态的,您可以在其中放入任何内容,但其他语言(如 C)没有这样的内容,那么如果将这个问题处理给其他语言,答案将如何,它在 python 中的等价物是什么?

标签: pythonlistclass

解决方案


  1. 创建一个新的实例d1

  2. 您可以选择:

    一个。获取对对象本身的引用

    湾。获取对该对象的弱引用。这样做的好处是,如果对象已经可以被删除,则引用不会使对象保持活动状态。

  3. 要不使用 alist或任何固定大小的容器,请使用链表d1._instances(类属性),我们会将每个新实例附加到链表的尾部。

  4. 为了简化 的迭代d1._instances,使其可迭代

  5. 过滤满足给定条件的实例。

import weakref


class Node:
    def __init__(self, value):
        self.value = value
        self.next = None

    def __iter__(self):
        current = self
        while current:
            yield current.value()  # Operation () is to access the value of the weak reference
            current = current.next


class d1:
    _instances = None
    _instances_tail = None

    def __init__(self, a, b):
        self.a = a
        self.b = b

        self._store_instance()

    def _store_instance(self):
        current = Node(weakref.ref(self))  # Or just <Node(self)> if you choose 2.a above
        if not self._instances:
            d1._instances = current
        else:
            d1._instances_tail.next = current
        d1._instances_tail = current

    @staticmethod
    def get_instances(condition=lambda value: True):  # Default behavior is get everything
        return filter(condition, d1._instances)


f0=d1(2,1)
f1=d1(2,3)
f2=d1(2,4)
f3=d1(4,4)

print("\nall")
for instance in d1.get_instances():
    print(type(instance), instance.a, instance.b)

print("\na == 2 and b < 4")
for instance in d1.get_instances(condition=lambda value: value.a == 2 and value.b < 4):
    print(type(instance), instance.a, instance.b)

print("\na == 2 and b >= 3")
for instance in d1.get_instances(condition=lambda value: value.a == 2 and value.b >= 3):
    print(type(instance), instance.a, instance.b)

print("\na == 4")
for instance in d1.get_instances(condition=lambda value: value.a == 4):
    print(type(instance), instance.a, instance.b)

输出

all
<class '__main__.d1'> 2 1
<class '__main__.d1'> 2 3
<class '__main__.d1'> 2 4
<class '__main__.d1'> 4 4

a == 2 and b < 4
<class '__main__.d1'> 2 1
<class '__main__.d1'> 2 3

a == 2 and b >= 3
<class '__main__.d1'> 2 3
<class '__main__.d1'> 2 4

a == 4
<class '__main__.d1'> 4 4

推荐阅读