一位流行的python老师编写了以下代码(在与str和repr方法相关的免费YouTube视频中(
class Car:
def __init__(self,color,mileage):
self.color = color
self.mileage = mileage
def __str__(self):
return 'a {self.color} car'.format(self=self)
>>>my_car = Car('red', 37281)
>>>print(my_car)
a red car
__str__
的身体看起来很有趣。虽然我确实了解 2 个自我是什么以及该语句如何评估,但我不明白使用这种定义的原因。
我为该方法尝试了更简单的替代定义:
def __str__(self):
return "this is a {x} car".format(x=self.color)
它似乎工作得很好。
>>> car1 = Car("grey", "ritz")
>>> str(car1)
'this is a grey car'
但我相信这个建议有一个正当的理由:
def __str__(self):
return 'a {self.color} car'.format(self=self)
我没有得到。谁能向我解释一下?
根据Car
类稍后是否被子类化以及此Car.__str__()
是否通过super
调用来调用,该定义是否有任何影响?
在字符串中包含值的一种方法是将键/值对传递给 format
方法;然后,分配给字符串的值可以使用键名称的{}
占位符。显示的代码可以将密钥替换为 self
以外的任何名称:
return 'a {x.color} car'.format(x=self)
f弦的一个理由是减少所需的重复量。
return f'a {self.color} car'
在这里,{self.color}
只是一个使用当前在范围内的名称的表达式,而不必通过 format
方法引入新名称。
(甚至在 f 字符串之前,有些人会写类似 'a {self.color} car'.format(**locals())
的东西,这将在格式字符串可用的名称中包含self
。但是,如果它还包含许多其他不必要的变量,除了损害可读性和为由于其他范围问题而难以跟踪的错误提供空间之外,这可能是不可取的。
将self
(变量(对象作为要格式化self
(变量名(对象传递。例如,它与 - 将self
替换为 yo
相同。代码有点模棱两可。
def __str__(self):
return 'a {yo.color} car'.format(yo=self)
我想我们可以直接问丹这件事https://stackoverflow.com/users/767412/dbader
您的替代版本和您要询问的版本完全相同,除了命名。 self
在 Python 中不是保留字,所以这只是一个变量名。此代码的作者一定认为此名称会使变量的作用更加清晰,但它似乎产生了相反的效果。