我有一个关于内置类型的子类型及其构造函数的问题.我想要一个类从元组和自定义类继承.
让我举一个具体的例子.我使用图表工作很多,这意味着与边缘连接的节点.我开始在自己的图形框架上做一些工作.
有一个类Edge,它有自己的属性和方法.它还应该继承自GraphElement类.(GraphElement是在特定图形的上下文之外没有任何意义的每个对象.)但在最基本的级别,边缘只是包含两个节点的元组.如果您可以执行以下操作,那将是很好的语法糖:
edge = graph.create_edge("Spam","Eggs")
(u, v) = edge
Run Code Online (Sandbox Code Playgroud)
所以(你,v)将包含"垃圾邮件"和"鸡蛋".它也支持迭代
for node in edge: ...
Run Code Online (Sandbox Code Playgroud)
我希望你明白为什么我想要子类型元组(或其他基本类型,如集).
所以这是我的Edge类及其init:
class Edge(GraphElement, tuple):
def __init__(self, graph, (source, target)):
GraphElement.__init__(self, graph)
tuple.__init__((source, target))
Run Code Online (Sandbox Code Playgroud)
我打电话的时候
Edge(aGraph, (source, target))
Run Code Online (Sandbox Code Playgroud)
我得到一个TypeError:tuple()最多需要1个参数(给定2个).我究竟做错了什么?
由于元组是不可变的,因此您还需要覆盖__new__方法.见http://www.python.org/download/releases/2.2.3/descrintro/#__new__
class GraphElement:
def __init__(self, graph):
pass
class Edge(GraphElement, tuple):
def __new__(cls, graph, (source, target)):
return tuple.__new__(cls, (source, target))
def __init__(self, graph, (source, target)):
GraphElement.__init__(self, graph)
Run Code Online (Sandbox Code Playgroud)
根据您的需要,我会避免多重继承,并使用生成器实现迭代器:
class GraphElement:
def __init__(self, graph):
pass
class Edge(GraphElement):
def __init__(self, graph, (source, target)):
GraphElement.__init__(self, graph)
self.source = source
self.target = target
def __iter__(self):
yield self.source
yield self.target
Run Code Online (Sandbox Code Playgroud)
在这种情况下,两种用法都可以正常工作:
e = Edge(None, ("Spam","Eggs"))
(s, t) = e
print s, t
for p in e:
print p
Run Code Online (Sandbox Code Playgroud)