继承没有属性?

2024-06-01 07:52:12 发布

您现在位置:Python中文网/ 问答频道 /正文

class Airplane:

    def __init__(self, plane_model, serial_num, num_seats, miles_travelled):
        self.model = plane_model
        self.serial = serial_num
        self.seat = num_seats
        self.miles = miles_travelled

class Flight:

    def __init__(self, plane):
        self.passangers = []
        self.airplane = plane

我正在尝试完成以下功能:

^{pr2}$

到目前为止,我的尝试是:

        if self.seat > 0:
            self.seat -= 1 #num_seats
            return True
        else:
            return False

当然,如果添加乘客,实例变量num_seats将减少1。可用的座位数在Airplane类的第三个参数中指示。在

如果使用我设计的函数,尝试与docstring中的操作完全相同的操作将返回以下错误:

Traceback (most recent call last):
  File "<pyshell#18>", line 1, in <module>
    f.add('a')
  File "/Users/N/Desktop/Untitled.py", line 39, in add
    if self.seat > 0:
AttributeError: 'Flight' object has no attribute 'seat'

我想我可能遗漏了一些东西,但我不确定是什么。在


Tags: selfmodelifinitdefserialnumclass
1条回答
网友
1楼 · 发布于 2024-06-01 07:52:12

您的具体错误是Flight实例没有seat属性,该属性是Airplane实例的属性,因此应该通过self.airplane属性(该属性提供指向将用于Flight实例的Airplane实例的链接):

if self.airplane.seat > 0:
      # ^ access via 'airplane' attribute

不过,我觉得你的造型总体上有点偏差。乘客的增加改变了Flight实例上的免费座位数,但并没有改变Airplane实例上的座位数(据我所知,他们不会像人们预订的那样从飞机上剥离座位!)另外,飞行距离是飞行的属性,而不是飞机。有鉴于此,我将实施如下:

^{pr2}$

注意,Flight.add检查以确保当前的passengers列表适合plane.seats。不需要保留一个单独的属性-free_seats可以从其他属性中计算出来,所以我将其设置为只读的property。使用中:

>>> f = Flight(Airplane("747", 5), "BA0123", 123)
>>> for person in ['John Cleese', 'Terry Gilliam', 'Eric Idle', 'Terry Jones', 'Michael Palin']:
    f.add(person)


>>> f.passengers
['John Cleese', 'Terry Gilliam', 'Eric Idle', 'Terry Jones', 'Michael Palin']
>>> f.add('Graham Chapman')

Traceback (most recent call last):
  File "<pyshell#32>", line 1, in <module>
    f.add('Graham Chapman')
  File "<pyshell#25>", line 13, in add
    raise Exception("Flight full.")
Exception: Flight full.
>>> f.free_seats
0

(别担心,格雷厄姆在这一点上是过去关心的。)

这并不完全符合您的规范,因为Flight.add现在如果航班已满,将引发一个错误,而不是返回False。这是一种更具python风格的编码方式;请参见"Easier to ask for forgiveness than permission"。在

相关问题 更多 >