如何继承Python None

如何继承Python None,python,Python,我想创建一个继承自None的类 我试过这个: class InvalidKeyNone(None): pass 但这给了我: TypeError: Error when calling the metaclass bases cannot create 'NoneType' instances 给我一个行为与None完全相同但可以进行类型测试的类型的正确解决方案是什么 foo = InvalidKeyNone() print(type(foo)) >>> I

我想创建一个继承自
None
的类

我试过这个:

class InvalidKeyNone(None):
    pass
但这给了我:

TypeError: Error when calling the metaclass bases
    cannot create 'NoneType' instances
给我一个行为与
None
完全相同但可以进行类型测试的类型的正确解决方案是什么

foo = InvalidKeyNone()
print(type(foo))
>>> InvalidKeyNone
[编辑]

之所以要这样做,是因为我正在Python数据结构上创建一个选择方案:

bar = select(".foo.bar.[1].x", {"foo":{"bar":[{"x":1}, {"x":2}], "baz":3})
print(bar)
>> 2
我希望能够确定是因为所选值为“无”还是因为找不到键而获得“无”。 但是,它必须返回一个(ducktyped)None,其行为与None完全相同。这里没有异常或自定义类型返回

[编辑]

好的,所以大家的共识是:不能这样做。虽然不能令人满意,但这是一个有效的答案。由于我确实希望默认行为在键不存在时返回None,因此我认为我将在适当的时候使用select eat a参数切换到异常抛出。谢谢。

None
是a,是
类型的唯一值。NoneType
(for,for)

无论如何,当您尝试从
types.NoneType继承时

from types import NoneType

class InvalidKeyNone(NoneType):
    pass

foo = InvalidKeyNone()
print(type(foo))
你会得到这个错误

Python 2

TypeError:调用元类基时出错 类型“NoneType”不是可接受的基类型

Python 3

ImportError:无法导入名称“NoneType”

简而言之,您不能从
NoneType

from types import NoneType

class InvalidKeyNone(NoneType):
    pass

foo = InvalidKeyNone()
print(type(foo))

无论如何,为什么要让类继承
NoneType

这是没有办法的,至少在你做了一些不可读的黑魔法之前是没有办法的


您可能应该使用异常。

将None子类化没有意义,因为它是一个单例,并且只能有一个。你说你想要一个具有相同行为的类,但没有一个没有任何行为

如果您真正想要的是一个唯一的占位符,您可以从函数返回该占位符以指示特殊情况,那么最简单的方法是创建对象的唯一实例:

InvalidKey = object()

result = doSomething()
if result is InvalidKey:
    ...

为什么要这样做?要扩展单例点,即使假设可以构造这样一个对象,使用它也会破坏Python stdlib的一半,因为到处使用的
if x is None:
习惯用法测试对象标识。由于该模式是推荐的模式,因此无法构造一些类似于None的类型,使其实例的行为与
None
完全相同。您也不希望依赖于类型检查-这是Python中的反模式。您应该检查对象是否支持接口;与其说是“检查和反应”,不如说是“尝试并观察”。看起来您还需要一个自定义异常。“行为与无完全相同”-据我所知,
None
没有非平凡的特殊行为“但是它必须返回一个行为与无完全相同的(ducktyped)None。这里没有返回异常或自定义类型。”为什么?其他人似乎都没有这种不寻常的需要。标准习惯用法是使用自定义sentinel,无论是完全指定的类类型还是简单的
sentinel=object()
。子类
KeyError
,并让您的代码提高它,而不是标准的
KeyError
。注意这里的区别是
bool(None)
False
,而
bool(InvalidKey)
True
解决方案是创建自定义类的单例实例,并将
\uuuu nonzero\uuuu
设置为返回false。在python 3中,您可以执行以下操作:键入(None)并返回NoneType我希望能够从
NoneType
继承,例如,对于转储到YAML,我将拥有多个类型,它们的行为都类似于
None
,但可以在YAML中以不同的方式表示(
NULL
~
NULL
,空标量,以及
NULL
类Foo(类型(None)):TypeError:type'NoneType'不是可接受的基类型
-:-DYou问,无论如何,为什么要类继承
NoneType
?最好从
NoneType
继承,以便为链表和树创建空节点
None.left=x
引发异常,因为
None
没有名为
left
的属性。对于链接列表的空节点,可以更改该行为