Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 类的特殊值_Python_Python 3.x_Oop_Inheritance - Fatal编程技术网

Python 类的特殊值

Python 类的特殊值,python,python-3.x,oop,inheritance,Python,Python 3.x,Oop,Inheritance,现在我正在创建一个表示闭合间隔的类。它的核心功能是提供一个intersect方法 课程间隔: 定义初始化(self,a,b): #检查另一个。另一个 如果self.b

现在我正在创建一个表示闭合间隔的类。它的核心功能是提供一个
intersect
方法

课程间隔:
定义初始化(self,a,b):
#检查另一个。另一个
如果self.b
应该可以表示特殊值,如所有点[-oo,oo]或空集{}。仍然使用
intersect
方法。我目前的方法是创建一个新类,但这似乎有点乏味

class EmptyInterval:
def intersect(自身、其他):
回归自我
假设这些特殊值“intersect方法优先”,我会在Intervall类方法前面加上前缀:

课程间隔:
...
def intersect(自身、其他):
如果不存在(自身、其他):
其他。相交(自)
...
澄清-以下内容应合法:

a=Intervall(1,2)
b=间隔(3,4)
c=a.相交(b)#导致间隔为空
c、 相交(a)#再次导致空间隔
是否有一些优雅的/更具python风格的/不那么恶心的丑陋方式来实现这样的行为


首先,我想到了继承,但这似乎很不合适,因为这些特殊的价值观应该具有优先权;i、 e.我不知道如何通过继承实现它。

在类中定义几个特殊函数
Interval

@staticmethod
def everything():
    return Interval(-math.inf, math.inf)

@staticmethod
def nothing():
    return Interval(math.nan, math.nan)
您可能会发现这样编写
nothing()
更为自然:

    return Interval(0, 0)
或者这个:

    return Interval(math.inf, math.inf)

这取决于您的其他代码,以及您认为最自然的表示空间隔的方式。请注意,与NAN的任何较小或较大的比较都将返回false,因此这可能会对您决定表示空间隔的方式产生一些影响(例如,
nothing().intersect(nothing())
假定为true或false?。

这可能是另一种解决方案:

我可以传递一个元组(a,b),而不是单独传递a,b。此外,我可以声明几个单例作为类变量。在实例化过程中,我将传递该单例,只需检查该值是否为单例之一,并相应地执行操作

课程间隔:
EMPTY=object()
一切=对象()
定义初始(自,边界):
self.bound=bounds
def intersect(自身、其他):
如果self.bounds==self.EMPTY或other.bounds==self.EMPTY:
返回间隔(self.EMPTY)
...
如果b
我想这可能比John的答案更不容易出错,因为math.inf和/或math.nan的一般行为。它还允许严格禁止传递这些值,因为间隔(math.nan,1)是无意义的


但在更复杂的环境中实施可能需要更多的努力。

谢谢您的回答!nothing().intersect(nothing())都不应该返回nothing(),Interval(math.nan,math.nan)就是这种情况。我自己刚刚想出了一个可能的解决方案,马上就要发布了。也许你可以对此发表评论。然后我将关闭线程。这样做会丢失所有类型安全:
EMPTY
不是
Interval
的实例。也许这对你来说没关系,但对某些人来说,这将是交易的破坏者。舒尔确实如此。但正如我所说,我更倾向于指定我的类将要具有的所有行为。任何方式:谢谢你的时间!