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

