如何继承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
的属性。对于链接列表的空节点,可以更改该行为