3

假设我有一个 Graph 类和一个 Vertex 类,定义如下

图.py

class Graph:

def __init__(self):
    self.adjacencyList = {}

def __str__(self):
    return str(self.adjacencyList)

def addVetex(self,key,value):
    if Vertex(key,value) not in self.adjacencyList:
        self.adjacencyList[Vertex(key,value)] = []

顶点.py

class Vertex:
def __init__(self,key,value):
    self.key = key
    self.value = value

def __str__(self):
    return "Key: ",str(self.key)," Value: ",str(self,value)

def __hash__(self):
    return self.key

如果我这样做:

G = Graph()
G.addVetex(1,None)
G.addVetex(2,None)
G.addVetex(1,3)
print G

它打印出来{<Vertex.Vertex instance at 0x110295b90>: [], <Vertex.Vertex instance at 0x110295bd8>: []}但我期待类似的东西{"Key:1 Value:None":[]...}

我的问题是我做错了什么?当一个字典被打印出来时,为什么它不尝试调用它的键/值的str函数?

谢谢。

4

4 回答 4

5

我相信您要实现的方法是使用当前代码获取所需的字符串Vertex.__repr__,这是 python 字典用来获取键的字符串表示形式的方法。

这是一个相关的stackoverflow答案,它揭示了__repr__和之间的区别__str__

于 2013-01-11T12:20:47.807 回答
1

乔的回答是正确的,这里是代码的测试版本:

def __repr__(self):
    return "Key: "+str(self.key)+" Value: "+str(self.value)

中实施Vertex。同样重要的是返回一个字符串,而不是问题中的元组。

于 2013-01-11T12:23:26.210 回答
1

这会做到的。注意添加了repr方法(以及对str方法的一点清理)。

class Vertex:
    def __init__(self,key,value):
        self.key = key
        self.value = value

    def __str__(self):
        return "{Key: "+str(self.key)+" Value: "+str(self.value)+"}"

    def __hash__(self):
        return self.key

    def __repr__(self):
        return str(self)

不过,您可能会考虑为您的顶点类子类化一个字典。您可以获得 dict 的所有好处,但可以添加方法以满足您的需求。最简单的版本如下所示:

class Vertex(dict):
    pass
于 2013-01-11T12:25:32.537 回答
-1

你可以这样做:

class Graph(object):
    def __str__(self):
        return ", ".join("Key: " + str(i.key) + " Value: " + str(i.value) for i in self.adjacencyList)
于 2013-01-11T12:27:49.623 回答