Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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_Oop_Graph - Fatal编程技术网

Python:从内置类型继承

Python:从内置类型继承,python,oop,graph,Python,Oop,Graph,我有一个关于内置类型的子类型及其构造函数的问题。我希望一个类同时从元组和自定义类继承 让我给你举个具体的例子。我经常处理图形,这意味着节点与边相连。我开始在自己的图形框架上做一些工作 有一个类Edge,它有自己的属性和方法。它还应该继承自类GraphiElement。(GraphiElement是在特定图形的上下文之外没有意义的每个对象。)但在最基本的层次上,边只是包含两个节点的元组。如果你能做到以下几点,那就太好了: edge = graph.create_edge("Spam","Eggs"

我有一个关于内置类型的子类型及其构造函数的问题。我希望一个类同时从元组和自定义类继承

让我给你举个具体的例子。我经常处理图形,这意味着节点与边相连。我开始在自己的图形框架上做一些工作

有一个类Edge,它有自己的属性和方法。它还应该继承自类GraphiElement。(GraphiElement是在特定图形的上下文之外没有意义的每个对象。)但在最基本的层次上,边只是包含两个节点的元组。如果你能做到以下几点,那就太好了:

edge = graph.create_edge("Spam","Eggs")
(u, v) = edge
所以(u,v)将包含“垃圾邮件”和“鸡蛋”。它还将支持类似的迭代

for node in edge: ...
我希望您了解我为什么要对tuple(或set等其他基本类型)进行子类型化

下面是我的Edge类及其init

class Edge(GraphElement, tuple):

def __init__(self, graph, (source, target)):
    GraphElement.__init__(self, graph)
    tuple.__init__((source, target))
当我打电话时

Edge(aGraph, (source, target))

我得到一个TypeError:tuple()最多接受1个参数(给定2个)。我做错了什么?

因为元组是不可变的,所以您也需要重写uu新的u方法。看


您需要覆盖
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

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
在这种情况下,两种用法都很好:

e = Edge(None, ("Spam","Eggs"))
(s, t) = e
print s, t
for p in e:
    print p

我懂了。这确实会给我所有我想要的语法细节。这似乎是更好的解决方案,谢谢。
e = Edge(None, ("Spam","Eggs"))
(s, t) = e
print s, t
for p in e:
    print p