【发布时间】:2018-11-01 17:42:22
【问题描述】:
我有一个类似以下的课程:
class Invoice
def __init__(self, invoice_id):
self.invoice_id = invoice_id
self._amount = None
@property
def amount(self):
return self._amount
@amount.setter
def amount(self, amount):
self._amount = amount
在上面的示例中,每当我尝试获取发票金额而不设置其值时,我都会得到一个无,如下所示:
invoice = Invoice(invoice_id='asdf234')
invoice.amount
>> None
但在这种情况下,无不是正确的金额默认值。我应该能够区分金额值为无与根本没有设置的金额值。所以问题如下:
- 当类属性没有正确的默认值时,我们如何处理?在上面的示例中,如果我从 init 中删除
self._amount = None,我将得到 self._amount 的 AttributeError,并且 self.amount 仅在我调用invoice.amount = 5后才会返回有效值。这是处理它的正确方法吗?但这也会导致对象状态不一致,因为应用程序会在运行时更改实例属性。 - 我保留了金额作为发票的属性,以便更好地理解和阅读发票及其属性。是否应该仅在我们知道其初始化/默认值时才使用类属性?
【问题讨论】:
-
如果
@property的作用与字段完全一样,为什么还要存在呢?无论如何,决定您想要哪种方法的一些相关问题是:1)带有amount的None的发票是什么意思? 2) 是一张从未设置过amount的发票应该存在,还是它的存在总是表示编程错误? -
假设我的应用程序正在侦听一个外部源,它在两个不同的事件中向我发送发票 ID 及其金额。对于第一个事件,我创建一个没有金额的发票,根据是否设置金额做出一些决定。在第二个事件中,一个新实例也将具有金额值。提供者也可以为金额发送 None 值,在这种情况下,应用程序服务会执行某些其他操作。
-
那么在你拥有 ID 和数量之前不要创建
Invoice对象。 -
但是我仍然需要调用不同的服务,这些服务将发票实例作为输入,并在收到发票 ID 时对第一个事件执行某些操作。
-
如果发票上有金额,这些服务将不起作用?
标签: python python-3.x oop