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

Python实例化类时,如何在f-string中引用类的其他属性?

Python类中自动生成包含其他属性的描述字段

问题场景

你定义了ShopItem类,希望实例的description属性自动包含utility属性的值,但创建实例时尝试在f-string中引用self.utility、utility等都会触发NameError,比如:

apple = ShopItem("Apple", 1.2, 2, f"A delicious apple.\nRestores {self.utility} hp")

报错提示name 'self' is not defined。

错误原因

  • 创建实例时的f-string是在模块/全局层面执行的,此时实例还未创建完成,self(仅在类方法内部有效)、apple(还未赋值)都不存在。
  • 直接写{utility}也不行,因为utility是你传入ShopItem的实参,在当前作用域中没有这个变量名。
  • ShopItem.utility是类属性,而你定义的是实例属性self.utility,类本身并没有这个属性,所以也无法引用。

解决方案

方案1:在__init__方法中生成描述

修改类的__init__方法,在实例初始化时自动生成包含utility的description,支持默认生成或自定义模板:

class ShopItem:
    def __init__(self, name='<unnamed>', price=0.00, utility=0, description=None):
        self.name = name
        self.price = price
        self.utility = utility
        
        # 未传入description时自动生成默认描述
        if description is None:
            self.description = f"A delicious apple.\nRestores {self.utility} hp"
        # 传入模板时替换占位符
        else:
            self.description = description.format(utility=self.utility)

# 用法1:自动生成默认描述
apple = ShopItem("Apple", 1.2, 2)
print(apple.description)
# 输出:
# A delicious apple.
# Restores 2 hp

# 用法2:自定义描述模板
orange = ShopItem("Orange", 1.5, 3, description="Juicy orange, restores {utility} HP!")
print(orange.description)
# 输出:Juicy orange, restores 3 HP!

方案2:用@property动态生成描述

如果utility属性可能后续被修改,希望description自动同步更新,可以使用@property装饰器,每次访问description时动态生成:

class ShopItem:
    def __init__(self, name='<unnamed>', price=0.00, utility=0, desc_template="A delicious apple.\nRestores {utility} hp"):
        self.name = name
        self.price = price
        self.utility = utility
        self.desc_template = desc_template

    @property
    def description(self):
        return self.desc_template.format(utility=self.utility)

# 创建实例
apple = ShopItem("Apple", 1.2, 2)
print(apple.description)
# 输出:
# A delicious apple.
# Restores 2 hp

# 修改utility后,description自动更新
apple.utility = 5
print(apple.description)
# 输出:
# A delicious apple.
# Restores 5 hp

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 22:07:48