- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想要具有以下属性的 2 个类 Interval
和 Segment
:
Interval
可以有 start
和 end
点,它们中的任何一个都可以被包含/排除(我已经使用必需的标志参数实现了这个像 start_inclusive
/end_inclusive
)。Segment
是一个包含两个端点的Interval
,因此用户不需要指定这些标志。如果用户尝试创建包含端点的Interval
,他会得到一个Segment
,如
>>> Interval(0, 1, start_inclusive=True, end_inclusive=True)
Segment(0, 1)
我的 MCVE到目前为止的实现是
区间
类:
class Interval:
def __new__(cls, start: int, end: int,
*,
start_inclusive: bool,
end_inclusive: bool) -> 'Interval':
if cls is not __class__:
return super().__new__(cls)
if start == end:
raise ValueError('Degenerate interval found.')
if start_inclusive and end_inclusive:
return Segment(start, end)
return super().__new__(cls)
def __init__(self,
start: int,
end: int,
*,
start_inclusive: bool,
end_inclusive: bool) -> None:
self.start = start
self.end = end
self.start_inclusive = start_inclusive
self.end_inclusive = end_inclusive
段
类:
class Segment(Interval):
def __new__(cls, start: int, end: int) -> 'Interval':
return super().__new__(cls, start, end,
start_inclusive=True,
end_inclusive=True)
def __init__(self, start: int, end: int) -> None:
super().__init__(start, end,
start_inclusive=True,
end_inclusive=True)
创作还挺有效
>>> Interval(0, 1, start_inclusive=False, end_inclusive=True)
<__main__.Interval object at ...>
>>> Interval(0, 1, start_inclusive=False, end_inclusive=False)
<__main__.Interval object at ...>
>>> Segment(0, 1)
<__main__.Segment object at ...>
但是
>>> Interval(0, 1, start_inclusive=True, end_inclusive=True)
失败并出现以下 TypeError
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: __init__() got an unexpected keyword argument 'end_inclusive'
所以我的问题是:
在父类的 __new__
中,是否有任何惯用的方法使用 __new__
和 __init__
“绑定(bind)”的一些参数来实例化子类一个 child ?
最佳答案
让我们先看看为什么会出现错误。当您调用派生自 object
的类时, __call__
metaclass 的方法( type
) 被调用。这通常是这样的
self = cls.__new__(...)
if isinstance(self, cls):
type(self).__init__(self)
这只是近似值,但足以传达这里发生的事情:
type.__call__
调用 Interval.__new__
start_inclusive 和 end_inclusive
,Interval.__new__
正确返回了 Segment
issubclass(Segment, Interval)
,type.__call__
使用您传递给调用的所有参数调用 Segment.__init__
到间隔
Segment.__init__
不接受任何关键字参数,并引发您看到的错误。对于这种情况,有许多解决方法。 @jdehesa's answer显示如何覆盖 type
的行为,以便 type.__call__
检查 type(obj) is cls
而不是使用 isinstance
.
另一种选择是分离Interval
和Segment
的层次结构。你可以做类似的事情
class MyBase:
# put common functionality here
class Interval(MyBase):
# __new__ and __init__ same as before
class Segment(MyBase):
# __new__ and __init__ same as before
通过这种安排,isinstance(Segment(...), Interval)
将为 False
,而 type.__call__
将为 不要尝试在Segment
上调用Interval.__init__
。
在我看来,最简单的方法是使用工厂模式。有一个外部函数,可以根据输入确定返回什么类型的对象。这样一来,你根本不需要实现__new__
,你的类构建过程也会简单很多:
def factory(start, end, *, start_inclusive, end_inclusive):
if start_inclusive and end_inclusive:
return Segment(start, end)
return Interval(start, end, start_inclusive=start_inclusive, end_inclusive=end_inclusive)
关于python - 用不同的 __new__ 签名为 child 实例化 __new__ 中的 child ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57078848/
我的收藏具有以下结构 { _id:1, parent_id:0 } { _id:2, parent_id:1 } { _id:3, parent_id:1 } { _id:4, par
到目前为止,我已经尝试过获取该对象的所有子对象,但它只带来了两个子对象。不都是 child 的 child 。我如何获取所有内容并循环获取特定名称对象 Transform[] objChild = g
这个问题不太可能对任何 future 的访客有帮助;它只与一个较小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于全世界的互联网受众。如需帮助使此问题更广泛适用,visit the
我有一个如下表 好吧,在这个表中每个用户都有一个父用户,那么如果我们选择一个用户,那么它的 id 、子代 id 和子代子代 id 应该作为数组返回。我需要一个查询来获取 Rails 中的这些值,而不使
我需要以下代码的帮助: HTML: process process 在点击 td[class=process] 时,我需要 input[name=dat
好的,所以我从中获得了一个 PHP,该 PHP 由依赖于手头动态情况的切换循环传播(我认为)。现在,当我添加一个复选框时,我希望能够使 div 中的第一个复选框具有顶部边框和侧面,没有底部。下面的只有
我正在使用 Swift 和 Sprite Kit。我有一个名为 MrNode 的 SKNode,它有多个 SKSpriteNodes 和 SKNode 子节点。一些SKNode有子节点,而这些子节点也
对不起,这个标题太俗了,但我真的不确定如何解释这个,我是新一代的 SQL 技能由于事件记录模式而退化的人之一! 基本上我在 PostgreSQL 中有三个表 客户端(一个客户端有很多 map ) -
我有这样的简单表格: 编号 parent_id 创建于 具有父/子关系...如果一行是子行,则它有一个 parent_id,否则它的 parent_id 为 0。 现在我想选择所有没有子项(因此本身)
所以我有这样的结构: 我的问题是:如何从每个主题中删除 ID 为 3Q41X2tKUMUmiDjXL1BJon70l8n2 的每个字段。我正在考虑这样的事情: admin.database().ref
这个问题在这里已经有了答案: Change opacity on all elements except hovered one (1 个回答) 关闭 5 个月前。 因此,当鼠标悬停在 child
我需要在 Delphi 5 中创建一个 QuickReport,其布局如下: +================ | Report Header +================ +========
假设我有这样的 html: Some more detailed code.... 我想知道如何在CSS中使用“A
我有一个使用 flexbox 的类似表格的布局: +--------------+---------------+-----------------+---------------+ | 1
我有一个关联,其中 user has_many user_items 和 user_items has_many user_item_images。与一个已经退出的用户。我可以创建一个新的 user_
我想选择无序列表中的前两个列表项。我可以这样选择第一项: ul li:nth-child(1) a { background: none repeat scroll 0 0 beige; }
ul li:first-child a { border-radius: 5px 5px 0 0; } ul li:last-child a { border-radius: 0 0 5p
我有一个这样的表:
或者这些术语用于指代同一事物? 我正在尝试在我的 Win32 应用程序中实现一些显示位图图像的自定义按钮。一个教程指出我应该使用 CreateWindow() 创建子窗口。 但是,我已经从另一个关于创
我想在 jquery 中获取我的 svg 的 id,我尝试了这个 jquery,但它是未定义的。 $(event.target).children('svg').attr("id") Target.e
我是一名优秀的程序员,十分优秀!