我正在读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的乘客集?
当您不希望这种行为时,正确的方法是什么?
答案 0 :(得分:5)
为什么要在该类的bus1实例上调用add_passenger()来更改bus2的乘客集?
因为没有 “ bus2
的乘客集(bus1
没有乘客的 ) 。在此代码中:
class Bus(object):
passengers = set()
... passengers
是一个类变量,在该类的所有实例之间共享,但并非属于这些实例,而是属于类本身 >,因此当您更改self.passengers
时,实际上就更改了Bus.passengers
,并且由于bus1.passengers
和bus2.passengers
是指 Bus.passengers
,{ {1}}始终为真。
如果您不希望出现这种情况,请实施bus1.passengers == bus2.passengers
方法:
__init__