Python 如何从另一个类调用一个类的所有实例?

Python 如何从另一个类调用一个类的所有实例?,python,class,oop,object,instance,Python,Class,Oop,Object,Instance,我有两节课 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(p

我有两节课

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\u list

class Bike:

    def __init__(self, position):          
        self.position = position
        for i in cars_list:
            # continue with code
因此,如果
cars\u list
在创建新的
Bike
之前发生了更改,则在
Bike
中调用当前的
cars\u list
。我知道如何做到这一点的方法是在
Bike
where中添加另一个参数

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

调用bike时,
cars\u list
作为参数传递。但是,有没有一种方法可以将当前的
cars\u列表存储在类
Car
中,然后在该类中创建一个名为
get\u current\u instances
的方法,以便可以在
Bike
类中调用它?

这是类属性的经典用例,还有一个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

您可以简单地执行
Car.cars\u list=[…]
,然后从您可以访问
Car
类的任何地方访问它。但这听起来真的很疯狂,我无法想象你想用它做什么。至少,您应该将列表作为参数传递给
Bike
,正如您所做的那样。@deceze严格来说,一个全局列表可以完成这项工作,但是由于OP在定义类方面遇到麻烦,因此避免全局列表是有意义的。如果OP想要做一个OOP解决方案,类属性和类方法是完全正确的用例。@Tony使用类属性不是在做“OOP”…@deceze我不同意。甚至C++也提供与类属性相同的静态属性。它可能不是纯粹的OOP,但它是许多语言中的一个常见习惯用法。它当然比全局的要好。@TonySuffolk66类属性只是命名空间中的全局状态。输入@classmethod:NameError:name“car_list”时出错。我想你是想写“cls.car_list”和init“car.car_list.append(self)”的