自定义 __str__ 和 __repr__ 不起作用

use*_*234 3 python

我正在尝试转换输出,例如:

decrypt : <torfuncs.TorHop instance at 0x7f44babb8440>
Run Code Online (Sandbox Code Playgroud)

变成更具可读性的东西,结果应该是数组中的字符串。我已经定义了__str____repr__但即使有这些,我仍然得到上面的结果。我究竟做错了什么?

class TorCircuit():
    def __init__(self, sock, circid):
        self.hops = []
        self.circId = circid
        self.socket = sock
        self.tempX = 0
        self.packetSendCount = 0
        self.cookie = []

    def __str__(self, hop):    
        return 'hop #%d' %  self.hops

    def __repr__(self, hop):
        return 'hop #%d' %  self.hops

    def decrypt(self, relayCell):
        for hop in self.hops:
            print "decrypt :", str(hop)
            relayCell = hop.decrypt(relayCell)
            if relayCell[1]==0 and relayCell[2]==0:
                return relayCell
        return relayCell
Run Code Online (Sandbox Code Playgroud)

我试图打印出当前用于解密的跃点

编辑托霍普

class TorHop:

    def __str__(self):    
        return 'hop #' %  self.hop

    def __repr__(self):
        return 'hop #' %  self.hop

    def __init__(self, KH, Df, Db, Kf, Kb):
        self.KH = KH
        self.Df = Df
        self.Db = Db
        self.Kf = Kf
        self.Kb = Kb

        self.fwdSha = SHA.new()
        self.fwdSha.update(Df)
        self.bwdSha = SHA.new()
        self.bwdSha.update(Db)

        ctr = Counter.new(128,initial_value=0)
        self.fwdCipher = AES.new(Kf, AES.MODE_CTR, counter=ctr)
        ctr = Counter.new(128,initial_value=0)
        self.bwdCipher = AES.new(Kb, AES.MODE_CTR, counter=ctr)
    def encrypt(self, data):
        return self.fwdCipher.encrypt(data)
    def decrypt(self, data):
        return self.bwdCipher.decrypt(data)
Run Code Online (Sandbox Code Playgroud)

有了这个我现在得到:

AttributeError: TorHop instance has no attribute 'hops'
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 5

您似乎认为str(hop)TorCircuit.decrypt()课堂上使用会转化为self.__str__(hop). 不是这种情况。它翻译为hop.__str__()相反。

换句话说,不要将这些方法放在TorCircuit类上,而是将它们放在TorHop类上。

当您将它们添加到 时TorHop,请考虑到这一点__str__并且__repr__不要接受参数。删除hop参数;selfTorHop实例:

def __str__(self):    
    return 'hop #%d' %  self.hop

def __repr__(self):
    return 'hop #%d' %  self.hop
Run Code Online (Sandbox Code Playgroud)

我会保留__repr__对调试更有用的东西:

def __repr__(self):
    return '<TorHop(%d)>' % self.hop
Run Code Online (Sandbox Code Playgroud)

也许。

接下来,您似乎期望对跃点进行编号。他们不是。您可以使用以下函数更改循环以在为对象打印的值之前添加一个数字:TorHopenumerate()

for i, hop in enumerate(self.hops):
    print "decrypt: hop #{} {}".format(i, hop)
Run Code Online (Sandbox Code Playgroud)

这将打印decrypt: hop #0, thendecrypt: hop #1等,然后是 的结果hop.__str__()