Python:如何让自定义类复用内置str类的所有方法
如何让自定义字符串类自动支持所有str内置方法?
你需要让StringMethods既能调用自定义方法,又无需手动实现所有str的内置方法,有两种常用方案可以解决这个问题:
方案1:直接继承内置str类
这是最简洁的方案,让你的自定义类成为str的子类,自动继承所有str的方法和特性,同时添加自己的扩展方法。
修改后的代码如下:
class StringMethods(str): """ StringMethods class: 继承自Python内置str类,新增字符串分析、密码校验等扩展方法。 """ def contains(self, char: str) -> bool: return char in self def containsany(self, chars: str | list | tuple | set) -> bool: for char in chars: if char in self: return True return False def hasdigit(self) -> bool: return self.containsany("0123456789") def haslower(self) -> bool: return self.containsany("abcdefghijklmnopqrstuvwxyz") def hasupper(self) -> bool: return self.containsany("ABCDEFGHIJKLMNOPQRSTUVWXYZ") def haswhitespace(self) -> bool: return self.contains(" ") # 测试 my_string = StringMethods("string123") print(my_string.hasdigit()) # 输出: True(自定义方法) print(my_string.upper()) # 输出: STRING123(内置str方法) print(my_string + "abc") # 输出: string123abc(支持str的拼接操作) print(my_string[0:3]) # 输出: str(支持str的切片操作)
优点:
- 完全兼容str的所有操作(拼接、切片、比较、哈希等)
- 代码简洁,无需额外处理方法转发
- 实例本身就是str类型,能直接用于所有接受str的场景
方案2:使用__getattr__魔术方法转发调用
如果因为某些原因无法直接继承str(比如已有其他父类),可以通过__getattr__方法,将未定义的方法调用转发给内部存储的str实例。
修改后的代码如下:
class StringMethods: """ StringMethods class: 扩展字符串功能的自定义类,可直接调用str的所有内置方法。 """ def __init__(self, string: str) -> None: self.string = string def contains(self, char: str) -> bool: return char in self.string def containsany(self, chars: str | list | tuple | set) -> bool: for char in chars: if char in self.string: return True return False def hasdigit(self) -> bool: return self.containsany("0123456789") def haslower(self) -> bool: return self.containsany("abcdefghijklmnopqrstuvwxyz") def hasupper(self) -> bool: return self.containsany("ABCDEFGHIJKLMNOPQRSTUVWXYZ") def haswhitespace(self) -> bool: return self.contains(" ") def __getattr__(self, name): # 当调用的方法/属性不存在时,转发给内部的str实例 attr = getattr(self.string, name) if callable(attr): # 如果是方法,返回包装函数,支持链式调用 def wrapper(*args, **kwargs): result = attr(*args, **kwargs) # 将返回的str重新包装为StringMethods实例,保持链式调用能力 if isinstance(result, str): return StringMethods(result) return result return wrapper return attr # 可选:实现__str__和__repr__,让实例的打印更符合预期 def __str__(self): return self.string def __repr__(self): return f"StringMethods({repr(self.string)})" # 测试 my_string = StringMethods("string123") print(my_string.hasdigit()) # 输出: True(自定义方法) print(my_string.upper()) # 输出: STRING123(内置str方法) # 链式调用示例 print(my_string.upper().lower()) # 输出: string123
注意事项:
__getattr__只会处理未在类中定义的属性/方法,自定义方法不受影响- 如果需要支持str的操作符(如
+、[]),需要额外实现对应的魔术方法(比如__add__、__getitem__) - 包装函数中把返回的str重新转为StringMethods实例,是为了支持链式调用(比如
my_string.upper().hasdigit())
内容的提问来源于stack exchange,提问作者darragh
相关产品推荐
相关产品推荐

