想搞一个对象继承自str,然后存一些额外信息用来标识这个字符串,然后理所当然地重写了__init__发现跪了: class newstring(str):

def __init__(self, value, othervalue):

str.__init__(self, value)

self.othervalue = othervalue

astring = newstring('hello', 'othervalue') # Fail

后来发现str的__new__是在__init__前调用的,然后str在__new__的时候发现参数不对就抛了个异常。这么诡异的行为主要是因为str的__new__就返回了个新的实例,而__init__没毛用。Python里面的str大概是这个样子:

class newstring(str):

def __new__(cls, value):

return str.__new__(cls, value)

def __init__(self, value):

pass

那么想要继承str并在构造时增加一个参数咋整呢,可以重写__new__:

class newstring(str):

def __new__(cls, value, othervalue):

return str.__new__(cls, value)

def __init__(self, value, othervalue):

self.othervalue = othervalue

或者更简单粗暴的,用*args和**kwargs作为参数重写__new__以绕过__new__的参数检查,然后__init__就可以正常调用了:

class newstring(str):

def __new__(cls, value, *args, **keywargs):

return str.__new__(cls, value)

def __init__(self, value, othervalue):

self.othervalue = othervalue

然后这样构造的newstring长的跟str一个样,并且可以携带额外信息,有一点需要注意,就是str是个不可变对象,所以newstring构造出来后就别YY能修改它的值了…

python怎么继承_Python: 如何继承str/string?相关推荐

  1. python面向对象继承_Python 面向对象 --- 继承

    目标 单继承 多继承 面向对象三大特性 1,封装 根据 职责 将 属性 和 方法 封装 到以抽象的 类 中 2,继承 实现代码的重用,相同的代码不需要重复的缩写 3,多态 不同的对象调用相同的方法,产 ...

  2. python单继承和多继承_Python 类继承(单继承和多继承)

    在面向对象的编程中,类的继承是非常重要的一个特性,Python同样支持类的继承.和Java等语言的单继承不同,Python支持类的单继承和有限的多继承. 一.Python类单继承 在Python中,类 ...

  3. python多继承顺序_Python多继承以及MRO顺序的使用

    多继承以及MRO顺序 1. 单独调用父类的方法 # coding=utf-8 print("******多继承使用类名.__init__ 发生的状态******") class P ...

  4. python accessiblechildren用法_python类继承用法实例分析

    本文实例讲述了python类继承用法.分享给大家供大家参考.具体如下: help('object') # test class Class1(object): """ C ...

  5. 利用python画钻石_python多继承(钻石继承)问题和解决方法简单示例

    本文实例讲述了python多继承(钻石继承)问题和解决方法.分享给大家供大家参考,具体如下: 在菱形多继承中,如果用父类.__init__()来调用父类的初始化方法,最上层会执行两次,所以遇到这种情况 ...

  6. python super().__init__()_python——多继承使用super().__init__ 发生的状态

    print("******多继承使用super().__init__ 发生的状态******") class Parent(object): def __init__(self, ...

  7. python多继承_Python多继承,__init__

    如果你想在子进程中使用super来调用parent .__ init__和parent2._init__,那么父__init__s也必须调用super: class parent(Base): def ...

  8. python实现父类继承_Python多继承用super调用父类方法?

    python的super传递:python多重继承的super调用父类的兄弟类 - 30天尝试新事情​30daydo.com 如果要调用父类的父类,可以直接用类名(类名需要在mro里面) # 多重继承 ...

  9. python .center用法_Python Pandas Series.str.center()用法及代码示例

    Series.str可用于以字符串形式访问系列的值并对其应用几种方法. Pandas Series.str.center()函数用于在系列/索引中的字符串的左侧和右侧填充其他字符.该功能等效于Pyth ...

最新文章

  1. 认认真真推荐9个值得关注的公众号
  2. cnpm install时提示resource busy or locked,syslink...
  3. 织梦在线艺术字体转换生成平台网站源码
  4. mac 如何安装ipython_Mac中如何快速安装Jenkins
  5. server2003 sp1预览与演示
  6. python重构迭代_Pylint:让你的 Python 代码保持一致
  7. Codeforces Round #565 (Div. 3) B. Merge it!
  8. Django:数据进行md5加密
  9. 【pyqt5学习】——pyqt5中.qrc资源文件的创建与编写
  10. python 批量下载地理空间数据云
  11. 阿里P3C自定义规则后本地打包成IDEA插件
  12. python无限循环一段句子,python无限循环语句如何实现
  13. 坎坷的微信小程序【笔记】
  14. 项目实战 |根据找到的variants的结果生成突变矩阵
  15. 成人职业教育:知乎、B站、网易“短兵相接”
  16. 学会用打码平台处理验证码
  17. 《初级会计电算化实用教程(金蝶KIS专业版)》一1.3 电算化会计信息系统
  18. ASUS(华硕) 天选air系统 2022 FX517ZC FX517ZE FX517ZM FX517ZR原厂Windows11系统 工厂系统安装 带一键恢复 华硕原厂系统ROG系统下载华硕OEM系统
  19. SourceTree解决冲突
  20. 思科开源杀软ClamAV中存在严重的RCE漏洞

热门文章

  1. 第一篇学术演讲准备两个月,去了谷歌却做不了深度学习,听Facebook田渊栋谈人生挑战与选择...
  2. 这届清华新生太难了吧!C++作业难到上热搜,特奖都说做不了,大厂猎头已密切关注...
  3. 打架斗殴烫头酗酒抽烟的小混混,逆袭保送中国科学院,后来怎么样了?
  4. 【免费福利】零AI基础,如何搭建聊天机器人:技术架构剖析
  5. RasberryPi快速启动(适合首次接触树莓派学习者)
  6. 模式设计概述:代理者模式
  7. Python3.5源码分析-List概述
  8. ubuntu16 18 用着速度不错的apt源
  9. python中yield的认识与学习|生成器
  10. 计算器,利用灰度图的顶帽扣出数字