[英]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.