我写这段代码是为了练习面向对象的编程。
在这里,我尝试将房子定义为房间列表,将每个房间定义为设备列表(例如灯)。
首先,我创建了所有对象,并将两个房间附加到房子,并为每个房间附加了不同的设备。非常基本。
问题是该设备似乎被附加到两个房间。这是为什么?
代码:
#! /usr/bin/python
class House:
def __init__(self, rooms = list()):
self.rooms = rooms
print('house created')
class Room:
def __init__(self, name = 'a room', devs = list()):
self.name = name
self.devs = devs
print('room ' + self.name + ' created')
class Device:
def __init__(self, name = 'a device'):
self.name = name
print('device ' + self.name + ' created')
def main():
#1
h = House()
r1 = Room(name = 'R1')
r2 = Room(name = 'R2')
d1 = Device(name = 'lamp1')
d2 = Device(name = 'lamp2')
#2
h.rooms.append(r1)
h.rooms.append(r2)
for room in h.rooms:
print room.name
print h.rooms[0]
print h.rooms[1]
h.rooms[1].devs.append(d1)
#3
for room in h.rooms:
print room.name
for dev in room.devs:
print('room ' + room.name + ' > ' + dev.name)
print room
print dev
if __name__ == '__main__' : main()
和输出。
house created
room R1 created
room R2 created
device lamp1 created
device lamp2 created
R1
R2
<__main__.Room instance at 0xb7d8a58c>
<__main__.Room instance at 0xb7d8a5ac>
R1
room R1 > lamp1
<__main__.Room instance at 0xb7d8a58c>
<__main__.Device instance at 0xb7d8a5cc>
R2
room R2 > lamp1
<__main__.Room instance at 0xb7d8a5ac>
<__main__.Device instance at 0xb7d8a5cc>
请注意,d1 的同一个实例在两个房间 r1 和 r2 中。
请您参考如下方法:
函数的默认参数值只计算一次。这意味着 House 的所有实例都将为 self.rooms 使用相同的列表实例(如果在构造中未给出 rooms 参数)。以同样的方式,Room 的所有实例将共享相同的 self.devs 列表。
为了解决这个问题,编写如下代码:
def __init__(self, rooms = None):
if rooms is None:
rooms = []
self.rooms = rooms
print('house created')
其他类也一样。
