检查 class 的所有实例是否具有确定属性的特定值的大多数 pythonic 方法

Most pythonic way to check whether all instances of a class have a specific value for a determined attribute

我想知道是否有 pythonic 方法来了解 class 的所有实例是否都具有确定属性的特定值。

假设我们有一个名为 A 的 class,我们已经从那个 class 创建了 3 个实例,分别称为 a1、a2 和 a3。所有这些实例都有一个 x 属性。

所以我想在这里做的是检查实例 a1、a2 和 a3 是否具有特定的 x 属性值,比方说 -100。

最简单的方法是什么?

注意事项:

  1. x 属性不是常量。
  2. class 个实例存储在列表中。
  3. 这些实例,它们中的每一个在构造函数中都有不同的x值。该值在游戏过程中会发生变化,但可以保持不变。

所以,在这里我只想检查是否所有实例都有一个常量值。顺便说一句,当这些实例的值是常量时,它们都等于 -100,并且它们彼此没有区别。

您是否尝试过 all 语句?

(未测试)

class A:
    def __init__(self, x: int) -> None:
        self.x = x

def main():
    a1 = A(128)
    a2 = A(128)
    a3 = A(128)
    l = [a1, a2, a3]
    if all([i.x == 128 for i in l]):
        print("All instances have same x")
    else:
        print("Some instances have different x")

main()

我的解决方案:

class A:
    instances = []
    def __init__(self):
        A.instances.append(self)
    
    @classmethod
    def all_instances_has(cls, attr, value):
        return all(getattr(ins, attr) == value for ins in cls.instances)

    def __del__(self):
        A.instances.remove(self)

a = A()
b = A()
a.abc = 1
b.abc = 1
print(A.all_instances_has("abc", 1))

它将 return 正确,但是,一旦您创建一个“abc”等于 2 的新实例,它将 return 错误:

c = A()
c.abc = 2
print(A.all_instances_has("abc", 1))

现在 - 它是错误的。

您可以将 getattr(ins, attr) 更改为 getattr(ins, attr, None) 以避免 AttributeError 特定实例甚至根本没有此属性。