为什么两个类实例都被更改?

时间:2019-07-07 11:56:41

标签: python python-3.x

我正在读this article有关Python(3)中的函数式编程的信息。

但是我在文本中不理解该示例:

class Bus(object):
     passengers = set()
     def add_passenger(self, person):
        self.passengers.add(person)

bus1 = Bus()
bus2 = Bus()
bus1.add_passenger('abe')
bus2.add_passenger('bertha')
bus1.passengers  # returns ['abe', 'bertha']
bus2.passengers  # also ['abe', 'bertha']

为什么要在该类的bus1实例上调用add_passenger()来更改bus2的乘客集?

当您不希望这种行为时,正确的方法是什么?

1 个答案:

答案 0 :(得分:5)

  

为什么要在该类的bus1实例上调用add_passenger()来更改bus2的乘客集?

因为没有 bus2 的乘客集(bus1没有乘客的 ) 。在此代码中:

class Bus(object):
     passengers = set()

... passengers是一个类变量,在该类的所有实例之间共享,但并非属于这些实例,而是属于类本身 >,因此当您更改self.passengers时,实际上就更改了Bus.passengers,并且由于bus1.passengersbus2.passengers 是指 Bus.passengers,{ {1}}始终为真。

如果您不希望出现这种情况,请实施bus1.passengers == bus2.passengers方法:

__init__