You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python __str__方法访问类属性报NameError的解决方法

报错原因

这个NameError是Python的作用域查找规则导致的:类体里定义的ranks、suits属于类属性,归属于类的命名空间,不会自动注入到实例方法的局部作用域里。在__str__方法里直接写ranks[self.rank]时,Python只会按顺序查找当前方法的局部变量、全局作用域的变量,不会主动检索类的命名空间,自然会报名称不存在的错误。

修复方法

实例方法里访问类属性有两种可靠写法:

  • 直接通过类名引用:Card.ranks、Card.suits,语义最明确,不会因为继承出现歧义
  • 通过实例self引用:self.ranks、self.suits,如果后续子类继承重写了类属性,会自动调用子类的属性值,灵活性更高

修复后可正常运行的完整代码:

class Card:

    ranks = ["Ace", "Two", "Three", "Four", "Five", "Six",
             "Seven", "Eight", "Nine", "Ten", "Jack", "Queen", "King"]
    suits = ["Clubs", "Diamonds", "Hearts", "Spades"]

    def __init__(self, rank=-1, suit=-1):
        self.rank = rank
        self.suit = suit

    def __str__(self):
        if self.rank != -1 and self.suit != -1:
            return "{0} of {1}".format(self.ranks[self.rank], self.suits[self.suit])
        else:
            return "Null"

print(Card(1, 0))

执行后会输出预期结果:Two of Clubs。

额外提示

如果需要在交互式终端直接输出实例、或者调试时看到实例的官方表示字符串,可以额外实现__repr__方法,类属性的访问规则和__str__完全一致。

内容的提问来源于stack exchange,提问作者ImHungry48

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 02:45:59