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

Python中将布尔值转换为'Yes'/'No'字符串的实现问题

代码存在的问题
  • 错误使用setter方法:你写的@duty.setter逻辑完全不符合setter的作用,setter的功能是接收外部传入的值,更新内部私有属性self._duty,但你的代码里不仅逻辑判断有误,还直接return了转换结果,完全没有修改私有属性的操作,这个setter是无效的。
  • 存储和输出逻辑不匹配:初始化时self._duty直接存储了布尔值,__str__方法里直接读取原始的布尔值输出,没有做布尔到Yes/No的转换。
  • 逻辑错位:你把取值转换的逻辑写在了赋值用的setter里,根本不会在读取属性的时候触发。
正确修改方案

这里给出两种可直接落地的修改方式,按需选择即可:

方案1:getter中做转换(适合需要保留内部布尔值做后续逻辑判断的场景)

内部存储还是保留原始布尔值,仅在读取duty属性时自动转换为Yes/No字符串,同时支持后续修改duty属性:

class Worker():
  def __init__(self,name,duty):
    self._name = name
    self._duty = duty

  @property
  def name(self):
    return self._name
  @property
  def duty(self):
    # 读取属性时自动转换格式
    return 'Yes' if self._duty else 'No'

  @duty.setter
  def duty(self, duty):
    # 赋值时仅做合法校验和属性更新即可
    if isinstance(duty, bool):
        self._duty = duty

  def __str__(self):
    # 调用duty属性拿到的就是转换后的字符串
    return f'Name: {self.name} Duty: {self.duty}'

if __name__ == '__main__':
    w1 = Worker('John', True)
    print(w1)
    # 测试修改属性的场景
    w1.duty = False
    print(w1)

运行输出:

Name: John Duty: Yes
Name: John Duty: No

方案2:初始化时直接转换(适合不需要修改duty属性的轻量场景)

初始化阶段直接把布尔值转成字符串存储,代码更简洁:

class Worker():
  def __init__(self,name,duty):
    self._name = name
    # 初始化直接转成目标格式存储
    self._duty = 'Yes' if duty else 'No'

  @property
  def name(self):
    return self._name
  @property
  def duty(self):
    return self._duty

  def __str__(self):
    return f'Name: {self._name} Duty: {self._duty}'

if __name__ == '__main__':
    w1 = Worker('John', True)
    print(w1)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 02:18:04