python - 使用满足多个条件的类的实例而不使用列表
问题描述
我想知道如何找到满足某些条件的类的实例并在不应用 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==2
and b<4
( f0
and f1
) 的实例并在不应用 python 列表的情况下使用它们。我想知道在没有像 python 列表这样的存储桶的其他语言中如何处理它们。
所以有2个问题:
- 多条件实例查找
- 在不使用 python 列表的情况下处理对象。
Python 列表是动态的,您可以在其中放入任何内容,但其他语言(如 C)没有这样的内容,那么如果将这个问题处理给其他语言,答案将如何,它在 python 中的等价物是什么?
解决方案
创建一个新的实例
d1
您可以选择:
一个。获取对对象本身的引用
湾。获取对该对象的弱引用。这样做的好处是,如果对象已经可以被删除,则引用不会使对象保持活动状态。
要不使用 a
list
或任何固定大小的容器,请使用链表d1._instances
(类属性),我们会将每个新实例附加到链表的尾部。为了简化 的迭代
d1._instances
,使其可迭代。过滤满足给定条件的实例。
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
推荐阅读
- batch-file - 尝试使用批处理阵列 ping 一些设备无法正确解决
- javascript - 在 illustrat CC2018 到 2021 中返回文件夹路径 illustrator jsx 不同的结果
- python-3.x - 为什么从 Python2.7 迁移到 3.7 会破坏我的子进程、池和标准输出的日志记录?
- apache - 如何使这个 .htaccess 服务器友好并适用于 .php?
- python - 为什么在python中重新分配对象私有属性不会抱怨?
- mysql - 从 excel 宏连接到 mysql db 时出现问题
- css - 变量中的 Sass 增量类
- c++ - 函数不返回值,而在 C++ 中使用向量
- javascript - 在对象数组中找到 5 个最大的数并将其推送到另一个数组
- jenkins - 使用 Google Kubernetes Engine 配置 Jenkins slave