检查 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。
最简单的方法是什么?
注意事项:
- x 属性不是常量。
- class 个实例存储在列表中。
- 这些实例,它们中的每一个在构造函数中都有不同的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
特定实例甚至根本没有此属性。
我想知道是否有 pythonic 方法来了解 class 的所有实例是否都具有确定属性的特定值。
假设我们有一个名为 A 的 class,我们已经从那个 class 创建了 3 个实例,分别称为 a1、a2 和 a3。所有这些实例都有一个 x 属性。
所以我想在这里做的是检查实例 a1、a2 和 a3 是否具有特定的 x 属性值,比方说 -100。
最简单的方法是什么?
注意事项:
- x 属性不是常量。
- class 个实例存储在列表中。
- 这些实例,它们中的每一个在构造函数中都有不同的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
特定实例甚至根本没有此属性。