相关疑难解决方法(0)

在Python的列表中对__str__感到困惑

来自Java背景,我明白__str__这就像是toString的Python版本(虽然我确实认识到Python是较旧的语言).

所以,我已经定义了一个小类以及__str__如下方法:

class Node:

    def __init__(self, id):
        self.id = id
        self.neighbours = []
        self.distance = 0


    def __str__(self):
        return str(self.id)
Run Code Online (Sandbox Code Playgroud)

然后我创建了一些它的实例:

uno = Node(1)    
due = Node(2)    
tri = Node(3)    
qua = Node(4)
Run Code Online (Sandbox Code Playgroud)

现在,尝试打印其中一个对象时的预期行为是打印相关值.这也发生了.

print uno
Run Code Online (Sandbox Code Playgroud)

产量

1
Run Code Online (Sandbox Code Playgroud)

但是当我做以下事情时:

uno.neighbours.append([[due, 4], [tri, 5]])
Run Code Online (Sandbox Code Playgroud)

然后

print uno.neighbours
Run Code Online (Sandbox Code Playgroud)

我明白了

[[[<__main__.Node instance at 0x00000000023A6C48>, 4], [<__main__.Node instance at 0x00000000023A6D08>, 5]]]
Run Code Online (Sandbox Code Playgroud)

在哪里我期待

[[2, 4], [3, 5]]
Run Code Online (Sandbox Code Playgroud)

我错过了什么?还有什么其他令人讨厌的东西我在做什么?:)

python printing string list tostring

113
推荐指数
5
解决办法
18万
查看次数

如何为类定义__str__方法?

在Python中,object该类充当所有(新式)类的根超类.至少默认情况下,应用strrepr任何子类的"类实例" object会产生相同的结果:

>>> class spam(object): pass
... 
>>> str(spam)
"<class '__main__.spam'>"
>>> str(spam) == repr(spam)
Run Code Online (Sandbox Code Playgroud)

我想定义的一个子类object,比方说fancyobject,也就是等同于object以各种方式,不同之处在于施加strreprfancyobject自身产生不同的输出:

>>> class ham(fancyobject): pass
...
>>> str(ham)
'ham'
>>> repr(ham)
"<class '__main__.ham'>"
Run Code Online (Sandbox Code Playgroud)

有没有办法在Python中执行此操作?

PS:我知道__str__特殊的方法,但我的理解是,如果类A重写__str__,那么只有str在实例上调用时才会调用重写方法A,而不是在调用它A本身时调用.即:

>>> class A(object):
...     def __str__(self):
...         return 'from new __str__: ' + object.__str__(self)
... 
>>> str(A())
'from new …
Run Code Online (Sandbox Code Playgroud)

python

26
推荐指数
2
解决办法
5万
查看次数

python内置str函数的意外行为

由于str.__call__我显然不理解的行为,我遇到了对str类进行子类型化的问题.

下面的简化代码可以很好地说明这一点.

class S(str):
    def __init__(self, s: str):
        assert isinstance(s, str)
        print(s)

class C:
    def __init__(self, s: str):
        self.s = S(s)

    def __str__(self):
        return self.s

c = C("a")  # -> prints "a"
c.__str__() # -> does not print "a"
str(c)      # -> asserts fails in debug mode, else prints "a" as well!?
Run Code Online (Sandbox Code Playgroud)

我一直认为str(obj)函数只是调用obj.__str__方法,就是这样.但由于某种原因,它也再次称之为__init__功能S.有人可以解释这种行为以及如何避免在使用该函数时S.__init__调用的结果吗?C.__str__str()

python

6
推荐指数
1
解决办法
91
查看次数

标签 统计

python ×3

list ×1

printing ×1

string ×1

tostring ×1