我有一个类,它的基本功能与下面的示例类似。构造函数接受两个参数,如果没有给定值,则这两个参数都默认为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
我遇到的问题是,我想限制类只允许用户为foo
或bar
提供一个值,但不能同时提供这两个值,也就是说,其中一个值应该正好包含一个值,另一个值应该是None
。我当前的方法是在foo=None and bar=None
或foo!=None and bar!=None
的情况下简单地引发一个异常。然而,这似乎是一个不雅观的解决方案。是否有更好的方法限制用户只输入两个参数中的一个,但仍然允许正确使用calculateFoo()
和calculateBar()
函数?有没有更好的方法来组织课程,以满足我的需要
正如评论中所建议的,您可以将类
ExampleClass
拆分为两个独立的类。目前,您的类正在尝试执行foo
和bar
操作,但如果未定义一个,则可能会引发异常,因为调用calculateFoo()
或calculateBar()
时未定义一个成员您可以做的是使用带有函数
calculate()
的abstract base class并由此派生两个独立的类Foo
和Bar
。派生类将被强制重写该函数。抽象基类纯粹是一个模板——您将无法创建它的实例,但它充当派生类的模板例如:
输出:
我认为你的
__init__
基本上是好的,但是首先检查两个参数一旦确定只传递了一个值,请根据它设置另一个值
一个改进是提供特定的类方法来为单个值创建实例,并且不鼓励使用
ExampleClass.__new__
本身相关问题 更多 >
编程相关推荐