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
相关产品推荐
相关产品推荐

