使用__name__作为属性

时间:2016-04-02 00:15:44

标签: python python-3.x python-2.7 class attributes

我正在读一本关于python类的书 我在__str__部分示例中发现的主要问题 他使用了他做的一件奇怪的事情

__class__.__name__

完整的代码是:

def __str__(self):
return '{} {},HP:{},xp:{}'.format(self.col.title(),self.__class__.__name__,self.points,self.exp)

你可以使用self.class并且它可以工作 这部分的作者评论我的意思是__class__.__name__ 他说。__name__这是类名的字符串版本 有人可以解释我的意思

1 个答案:

答案 0 :(得分:11)

我们假设您定义了一个类:

class MyClass:
    def __str__(self):
        return str(self.__class__)

如果您尝试打印该课程,请查看您的内容:

>>> instance = MyClass()
>>> print(instance)
__main__.MyClass

这是因为该类的字符串版本包含它所定义的模块。在这种情况下,它在当前正在执行的模块中定义,shell,因此它显示为__main__.MyClass 。但是,如果我们使用self.__class__.__name__

class MyClass:
    def __str__(self):
        return self.__class__.__name__

instance = MyClass()
print(instance)

输出:

MyClass

该类的__name__属性不包含该模块。

注意:__name__属性给出了最初给予该类的名称。任何副本都将保留名称。例如:

class MyClass:
    def __str__(self):
        return self.__class__.__name__

SecondClass = MyClass

instance = SecondClass()
print(instance)

输出:

MyClass

这是因为__name__属性被定义为类定义的一部分。使用SecondClass = MyClass只是为该类指定另一个名称。它不会以任何方式修改类或名称。