【问题标题】:How to call all instances of a class from another class?如何从另一个类调用一个类的所有实例?
【发布时间】:2018-11-04 10:25:52
【问题描述】:

我有两节课

class Car:

    def __init__(self, position):  
        self.position = position


class Bike:

    def __init__(self, position):          
        self.position = position

在一个单独的文件中,我正在创建多辆汽车和自行车:

cars_list = [Car(position[i]) for i in range(position_list)]

我想在当前时刻每次创建Bike 实例时在Bike 类中调用并使用cars_list

class Bike:

    def __init__(self, position):          
        self.position = position
        for i in cars_list:
            # continue with code

因此,如果 cars_list 在创建新的 Bike 之前发生更改,则在 Bike 中调用当前的 cars_list。我知道如何做到这一点的方法是在Bike where 中添加另一个参数

def __init__(self, position, cars_list):          
            self.position = position
            for i in cars_list:
                # continue with code

当调用bike 时,cars_list 作为参数传递。但是有没有办法将当前的cars_list 存储在Car 类中,然后在该类中创建一个名为get_current_instances 的方法,以便可以在Bike 类中调用它?

【问题讨论】:

  • 您可以简单地执行Car.cars_list = [...],然后从您可以访问Car 类的任何地方访问它。但这听起来真的很疯狂,我无法想象你想用它做什么。至少,您应该将列表作为参数传递给Bike,就像您正在做的那样。
  • @deceze 严格来说,全局列表可以完成这项工作,但由于 OP 会遇到定义类的麻烦,因此避免全局变量是有意义的。如果 OP 想要做一个 OOP 解决方案,类属性和类方法是完全正确的用例。
  • @Tony 使用类属性不是在做“OOP”……
  • @deceze 我不敢苟同。甚至 C++ 也提供与类属性相同的静态属性。它可能不是纯粹的 OOP,但它是许多语言中的常见习语。它肯定比全局更好。
  • @TonySuffolk66 类属性只是命名空间中的全局状态。

标签: python class oop object instance


【解决方案1】:

这是类属性的经典用例,也是 Car 上的一个类方法 - 实际上您想要存储和检索有关 Car 类的数据。

例如:

class Car:
    car_list = []

    def __init__(self, position):  
        self.position = position
        Car.car_list.append(self)

   @classmethod
   def get_current_instances(cls):
       return Car.car_list


class Bike:
    def __init__(self, position):          
        self.position = position

   # Example method to show how the Car class is used
   def move(self, position):
       cars = Car.get_current_instances()
       for car in cars:
           if car.position == position:
              self.crash() # Arrgh a crash between the bike and car
           else:
               self.position = position

【讨论】:

  • 输入@classmethod 时出现错误:NameError: name 'car_list' is not defined。我认为你的意思是写 'cls.car_list' 并在 init 'Car.car_list.append(self)'
猜你喜欢
  • 2022-07-08
  • 2015-06-10
  • 1970-01-01
  • 2011-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多