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

Python:调用类属性时直接获取指定参数且保留其他属性访问

实现需求的两种方案

方案一:重写__repr__(保持Character为独立类)

这种方案让Character实例在交互环境中显示为对应的字符,但本质仍是自定义类实例,保留属性访问能力。

修改Character类,添加__repr__方法:

class Character:
    def __init__(self, c: str, v: bool):
        self.name = c
        self.is_vowel = v
    
    def __repr__(self):
        # 返回带引号的字符,和Python字符串的默认显示一致
        return repr(self.name)
    
    # 可选:添加__str__方法,让print输出不带引号的字符
    def __str__(self):
        return self.name

class Alphabet:
    a: Character = Character('a', True)
    b: Character = Character('b', False)
    c: Character = Character('c', False)
    alpha: Character = Character('α', True)

实际效果:

>>> Alphabet.a
'a'
>>> Alphabet.a.is_vowel
True
>>> print(Alphabet.a)
a

优点:

  • 完全保留原有的类结构,逻辑清晰
  • IDE代码补全不受影响,能识别is_vowel等属性
  • 启动时初始化数据的方式不变

缺点:

  • Character实例本质不是字符串,若要参与字符串操作(如拼接),需要显式转换为str():"hello" + str(Alphabet.a)

方案二:让Character继承自str(实例本身就是字符串)

这种方案让Character成为字符串的子类,既拥有字符串的所有特性,又能附加自定义属性,完全满足“直接访问得到字符值+保留属性”的需求。

代码实现:

class Character(str):
    def __new__(cls, c: str, v: bool):
        # 因为str是不可变类型,需要用__new__初始化实例
        obj = super().__new__(cls, c)
        obj.is_vowel = v
        return obj

class Alphabet:
    a: Character = Character('a', True)
    b: Character = Character('b', False)
    c: Character = Character('c', False)
    alpha: Character = Character('α', True)

实际效果:

>>> Alphabet.a
'a'
>>> Alphabet.a.is_vowel
True
>>> "hello" + Alphabet.a
'helloa'
>>> Alphabet.a.upper()
'A'

优点:

  • 实例本身就是字符串,可直接参与所有字符串操作,无需转换
  • 完美匹配你要的交互行为
  • IDE代码补全正常工作,同时还能补全字符串的内置方法
  • 启动时初始化的方式保持不变

缺点:

  • 因为继承自str,若后续需要修改Character的核心行为,需注意不可变类型的特性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 07:15:26