gpt4 book ai didi

python - 在 Python 类构造函数中只允许一对参数中的一个的最佳方法是什么?

转载 作者:行者123 更新时间:2023-12-04 16:41:06 24 4
gpt4 key购买 nike

我有一个类,其功能基本上类似于下面的示例。构造函数有两个参数,如果没有给出值,它们都默认为 None。该类的目标是,给定 foo 的值,用户可以调用 calculateBar() 函数来计算 bar 的值.相反,用户应该能够为 bar 提供一个值,然后调用 calculateFoo() 函数来计算 foo 的值。值得注意的是,这些函数本质上是彼此相反的。

class ExampleClass:
def __init__(self, foo=None, bar=None):
self.foo = foo
self.bar = bar

# Essentially an XNOR. Raises an exception if:
# 1. Both foo and bar are 'None' (no value given for either)
# 2. Neither foo, nor bar are 'None' (value given for both)
if bool(foo == None) == bool(bar == None):
raise ValueError("Please give a value for Foo or Bar (but not both)")

def calculateFoo(self):
return self.bar / 2.0

def calculateBar(self):
return self.foo * 2.0

我遇到的问题是我想限制类只允许用户为 foobar 提供值,但不能同时提供这两个值,即其中一个应该有一个值,另一个应该是 None。我当前的方法是在 foo=None 和 bar=Nonefoo!=None 和 bar!=None 的情况下简单地引发异常。然而,这似乎是一个不优雅的解决方案。有没有更好的方法来限制用户只输入两个参数之一,但仍然允许正确使用 calculateFoo()calculateBar() 函数?有没有更好的方法来组织类(class)以满足我的需要?

最佳答案

如评论中所建议,您可以将类 ExampleClass 拆分为两个单独的类。目前你的类(class)正在尝试做 foo 事情和 bar 事情但是如果一个没有定义你留下了引发异常的可能性,因为一个成员没有定义当调用 calculateFoo()calculateBar()

你可以做的是拥有一个 abstract base class使用函数 calculate() 并从中派生出两个单独的类 FooBar。您的派生类将被迫覆盖该函数。抽象基类纯粹是一个模板 - 您将无法创建它的实例,但它充当派生类的模板。

例子:

from abc import ABC, abstractmethod

class BaseClass(ABC):
@abstractmethod
def calculate(self):
pass

class Foo(BaseClass):
def __init__(self, foo):
self.foo = foo

def calculate(self):
return self.foo / 2.0

class Bar(BaseClass):
def __init__(self, bar):
self.bar = bar

def calculate(self):
return self.bar * 2.0


foo = Foo(10)
print(foo.calculate())

bar = Bar(10)
print(bar.calculate())

输出:

5.0
20.0

关于python - 在 Python 类构造函数中只允许一对参数中的一个的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60658819/

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