Python: 如何继承str/string?
想搞一个对象继承自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: 如何继承str/string?的更多相关文章
- Python 3之str类型、string模块学习笔记
Windows 10家庭中文版,Python 3.6.4, Python 3.7官文: Text Sequence Type — str string — Common string operatio ...
- [py]python的继承体系-源码目录结构
python3安装目录 pip install virtualenv pip install virtualenvwrapper pip install virtualenvwrapper-win m ...
- [py]python的继承体系
python的继承体系 python中一切皆对象 随着类的定义而开辟执行 class Foo(object): print 'Loading...' spam = 'eggs' print 'Done ...
- Python 字符串操作及string模块使用
python的字符串操作通过2部分的方法函数基本上就可以解决所有的字符串操作需求: python的字符串属性函数 python的string模块 1.字符串属性方法操作: 1.>字符串格式输出对 ...
- sqlalchemy mark-deleted 和 python 多继承下的方法解析顺序 MRO
sqlalchemy mark-deleted 和 python 多继承下的方法解析顺序 MRO 今天在弄一个 sqlalchemy 的数据库基类的时候,遇到了跟多继承相关的一个小问题,因此顺便看了一 ...
- python基础——继承和多态
python基础——继承和多态 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类 ...
- 转 Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
转自: http://www.cnblogs.com/huangcong/archive/2011/08/29/2158268.html 黄聪:Python 字符串操作(string替换.删除.截取. ...
- Python 字典(Dictionary) str()方法
Python 字典(Dictionary) str()方法 描述 Python 字典(Dictionary) str() 函数将值转化为适于人阅读的形式,以可打印的字符串表示.高佣联盟 www.cge ...
- [修]python普通继承方式和super继承方式
[转]python普通继承方式和super继承方式 原文出自:http://www.360doc.com/content/13/0306/15/9934052_269664772.shtml 原文的错 ...
随机推荐
- 关于Guid
GUID(全局统一标识符)是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的.通常平台会提供生成GUID的API.生成算法很有意思,用到了以太网卡地址.纳秒级时间.芯片ID码和许多可 ...
- PyCharm 4.5.4 环境配置
1.去掉“自动保存功能” pycharm默认是自动保存的,习惯自己按 ctrl + s 的可以进行如下设置: 菜单File -> Settings... -> Appearance &am ...
- 基于QT的webkit与ExtJs开发CB/S结构的企业应用管理系统
一:源起 1.何为CB/S的应用程序 C/S结构的应用程序,是客户端/服务端形式的应用程序,这种应用程序要在客户电脑上安装一个程序,客户使用这个程序与服务端通信,完成一定的 ...
- [外挂1] MFC 鼠标位置设置
a.取得窗口相对坐标 b.读出游戏窗口信息GetWindowRect c.移动鼠标指针SetCursorPos HWND gameh;//游戏窗口句柄 RECT r1;//RECT结构表示一个矩 ...
- DOS与Linux的换行字符
一.vim打开window下的文件出现 ^M 首先理解,dos(windows)下建立的文件的换行是 ^M\$ (CRLF) ,而在Linux下面,仅仅是以 \$ (LF) 来做断行符号: (^M\ ...
- Minifying Angular应用时产生的问题
一.产生的问题 如果你正在进行AngularJS的项目开发,生产时Minified JS文件有没有遇到下面问题: angular.module("myApp", []) .cont ...
- 安装 Dubbo 注册中心(Zookeeper-3.4.6)--单节点
1.建议使用dubbo-2.3.3以上版本的使用zookeeper注册中心客户端2.Zookeeper是Apache Hadoop的子项目,强度相对较好,建议生产环境使用该注册中心.3.Dubbo未对 ...
- JSP JSTL EL
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> Html代码 复制代 ...
- shell 学习文章列表
linux shell 逻辑运算符.逻辑表达式详解 linux shell 自定义函数(定义.返回值.变量作用域)介绍 shell export 作用 linux bash shell之declare
- mac下缺乏make wget怎么办?
1.下载command Line tools for Xcode http://www.mkyong.com/mac/how-to-install-gcc-compiler-on-mac-os-x/ ...