返回符合条件的类的所有实例

时间:2019-07-15 03:58:09

标签: python

我是Python的新手,所以我可能并没有以正确的方式提出这个问题,因此我试图找到答案(显然是失败的)。

我正在尝试建立一个类,然后查找该类中符合特定条件的所有实例。我不知道上课是否是解决此问题的正确方法,因此欢迎所有建议(即使使我远离上课)。

举一个简单的例子(请参见下面的代码),如果我想找到所有30岁以上的雇员,正确的方法是创建类方法吗?实际上,您将拥有DOB而不是年龄,但为简单起见,我已经随年龄而逝。我还需要某种变量,以便可以将30更改为50。

class Employee:
  def __init__(self, name, age):
    self.name = name
    self.age = age

e1 = Employee("John", 36)
e2 = Employee("Sally", 21)
e3 = Employee("Jamie", 53)

实现此目标的“正确”方法或有效方法是什么?对于上面这个年龄超过30岁的示例,我需要e1和e3实例。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:4)

通常,您会将实例放在某种集合中,例如列表,而不是单个变量。然后,您可以过滤列表或使用列表理解来获取所需列表中的元素。这是一个具有列表理解的示例:

class Employee:
    def __init__(self, name, age):
        self.name = name
        self.age = age

employees = [
    Employee("John", 36),
    Employee("Sally", 21),
    Employee("Jamie", 53)
]

over_thirty = [e for e in employees if e.age > 30]

for e in over_thirty:
    print(e.name)

打印:

John
Jamie

您可以避免使用多余的列表over_thirty,并直接在过滤器结果上进行迭代以得到相同的结果:

for e in filter(lambda e: e.age > 30, employees):
    print(e.name)

答案 1 :(得分:0)

或者也可以修改类:

class Employee:
  def __init__(self, name, age):
    self.name = name
    self.age = age
    self.age_over_30 = self.age > 30

l = [Employee("John", 36), Employee("Sally", 21), Employee("Jamie", 53)]
print([i.name for i in l if i.age_over_30])

或者,如果您要修改age属性,请创建类:

class Employee:
  def __init__(self, name, age):
    self.name = name
    self.age = age
  @property
  def age_over_30(self):
      return self.age > 30