簡體   English   中英

Python:繼承內置類型

[英]Python: Inheriting from Built-In Types

我有一個關於內置類型的子類型及其構造函數的問題。 我想要一個類從元組和自定義類繼承。

讓我舉一個具體的例子。 我使用圖表工作很多,這意味着與邊緣連接的節點。 我開始在自己的圖形框架上做一些工作。

有一個類Edge,它有自己的屬性和方法。 它還應該繼承自GraphElement類。 (GraphElement是在特定圖形的上下文之外沒有任何意義的每個對象。)但在最基本的級別,邊緣只是包含兩個節點的元組。 如果您可以執行以下操作,那將是很好的語法糖:

edge = graph.create_edge("Spam","Eggs")
(u, v) = edge

所以(你,v)將包含“垃圾郵件”和“雞蛋”。 它也支持迭代

for node in edge: ...

我希望你明白為什么我想要子類型元組(或其他基本類型,如集)。

所以這是我的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個)。 我究竟做錯了什么?

由於元組是不可變的,因此您還需要覆蓋__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)

根據您的需要,我會避免多重繼承,並使用生成器實現迭代器:

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

你需要覆蓋__new__ - 當前tuple.__new__被調用(因為你沒有覆蓋它)與你傳遞給Edge所有參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM