类方法中self = self的原因是什么?

时间:2019-07-28 16:14:38

标签: python python-3.x class tostring

一位受欢迎的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的定义有影响吗?

3 个答案:

答案 0 :(得分:2)

在字符串中包含值的一种方法是将键/值对传递给format方法。则分配给字符串的值将与键名一起用{}占位符提供。显示的代码可以用self以外的任何名称替换 key

    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。但是,如果它还包含一个许多额外不必要的变量,除了会损害可读性并为由于其他范围问题导致的难以跟踪的错误提供空间。)

答案 1 :(得分:1)

您将self(变量)对象作为要格式化的self(变量名)对象进行传递。例如,将self替换为yo。代码有点模棱两可。

def __str__(self):
    return 'a {yo.color} car'.format(yo=self)

我想我们可以直接问Dan https://stackoverflow.com/users/767412/dbader

答案 2 :(得分:0)

您的替代版本和您要询问的版本完全相同,除了命名。 self在Python中不是保留字,因此这只是一个变量名。这段代码的作者一定以为这个名称可以使变量的作用更清晰,但似乎起到了相反的作用。