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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 19:50:26