3 回答

TA贡献1806条经验 获得超5个赞
None通常用于缺少值,但有时您需要它实际上是一个允许的值。如果您希望能够区分None和未设置的值,只需为此目的定义您自己的单例。
class Undefined:
__str__ = __repr__ = lambda self: "Undefined"
Undefined = Undefined()
class Invoice
def __init__(self, invoice_id):
self.invoice_id = invoice_id
self._amount = Undefined
@property
def amount(self):
return self._amount
@amount.setter
def amount(self, amount):
if amount is Undefined:
raise ValueError("amount must be an actual value")
self._amount = amount
当然,您现在可能需要Undefined在其他方法中进行测试,以确保在正确初始化实例之前它们没有被使用。更好的方法可能是在初始化期间设置属性并要求将其值传递给__init__(). 这样,您就可以避免Invoice处于无效(未完全初始化)状态。有人仍然可以设置_amount为无效值,但他们只会遇到他们所要求的麻烦。我们这里都是成年人。

TA贡献1895条经验 获得超7个赞
property在这种情况下不要使用 a 。你的 getter 和 setter除了 return 和 set the value 什么都不做。只需使用普通属性即可。如果您以后想要控制访问权限,您可以稍后添加该属性,而无需更改类的接口!
至于处理未设置的值,只需创建自己的对象来表示从未设置过的值。它可以很简单:
>>> NOT_SET = object()
>>> class Invoice:
... def __init__(self, invoice_id):
... self.invoice_id = invoice_id
... self.amount = NOT_SET
...
>>> inv = Invoice(42)
>>> if inv.amount is NOT_SET:
... inv.amount = 1
...
enum如果您想更好地支持打字,也可以使用。
添加回答
举报