gpt4 book ai didi

python - 强制始终为两个 python 类属性之一赋值?

转载 作者:太空宇宙 更新时间:2023-11-04 09:09:39 27 4
gpt4 key购买 nike

在 python 中有没有一种方法可以给定一个 python 类:

class Foo(object):
apple = None
orange = None
def __init__(self, apple=None, orange=None)
super(Foo, self).__init__()
self.apple = apple
self.orange = orange

在 Foo 对象init 之后,必须始终将两个属性(apple、orange)之一分配给 None 以外的值,并且在任何时候都不应将两个属性分配给某物除了无。

换句话说:

                      orange is None    |    orange is not None
|
apple is None NO | YES
________________________________________|___________________________
|
apple is not None YES | NO

如何在 python 中做到这一点?

最佳答案

在构造函数中,如果它们都为 None 或都已设置,则引发 ValueError 非常简单。问题在后面的代码中。

遵循最小意外原则,我认为您应该将变量标记为私有(private)并使用 setter 方法(不是属性 setter,普通的旧方法)。这清楚地表明您在设置值时正在执行额外的逻辑,并且它为您提供了一个明显的位置,可以在以后需要时添加额外的逻辑。不过,使用 getter 属性方法会很好。所以像这样:

class Foo(object):
def __init__(self, apple=None, orange=None):
super(Foo, self).__init__()
if apple is None and orange is None:
raise ValueError('apple and orange cannot both be None')
if apple is not None and orange is not None:
raise ValueError('apple and orange cannot both be set')

self._apple = apple
self._orange = orange

@property
def apple(self):
return self._apple

@property
def orange(self):
return self._orange

def setAppleClearOrange(self, value):
if value is None:
raise ValueError('Cannot set both to None')
self._orange = None
self._apple = value

def setOrangeClearApple(self, value):
if value is None:
raise ValueError('Cannot set both to None')
self._apple = None
self._orange = value

是的,它有点冗长,但它很明显您的意图是什么,这实际上更重要。

关于python - 强制始终为两个 python 类属性之一赋值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16805664/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com