Python常用特殊方法实例总结


Posted in Python onMarch 22, 2019

本文实例讲述了Python常用特殊方法。分享给大家供大家参考,具体如下:

1 __init__和__new__

__init__方法用来初始化类实例;__new__方法用来创建类实例。

主要的区别:

1).__init__通常用于初始化一个新实例,控制初始化的过程,发生在类实例被创建完以后。它是实例级别的方法。

2).__new__通常用于控制生成一个新实例的过程。它是类级别的方法。

__new__具体的作用:

1) 继承一些不可变的class时(比如int, str, tuple),提供一个自定义这些类的实例化过程的途径

2) 实现自定义的metaclass

例子:实现永远返回正数

class PositiveInteger(int): #继承类int
  def __new__(cls, value):
    return super().__new__(cls, abs(value)) #返回父类的__new__方法
i = PositiveInteger(-3) #类实例化
print(i)
3

注意点:

关于__init__方法:第一个参数必须是self;无返回值

关于__new__方法:

1) 继承自object的新式类才有__new__

2) __new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供

3) __new__必须要有返回值,返回实例化出来的实例(也就是__init__self),可以返回父类__new__出来的实例,或者直接是object的__new__出来的实例

2 __del__方法

当对象所有的引用都被删除后触发该方法,代码如下:

class Testdel():
  def __del__(self):
    print("using __del__")
t = Testdel()
t1 = t
del t1
del t
using __del__

3 __str__和__repr__

__repr____str__这两个方法都是用于显示的,__str__是面向用户的,而__repr__面向程序员

定义__repr__的简单方法:定义了__str__之后,赋值给__repr__,如下:

__repr__ = __str__

4 属性访问

__getattr__(self, name):当用户试图获取一个不存在的属性(name)时的行为

__getattribute__(self, name):当类的属性被访问时的行为

__setattr__(self, name, value):当一个属性被设置时的行为

__delattr__(self, name):当一个属性被删除时的行为

死循环陷阱:

class Rectangle:
  def __init__(self, width=0, height=0):
    self.width = width
    self.height = height
  def __setattr__(self, name, value):
    if name == ‘square':
      self.width = value
      self.height = value
    else:
      self.name = value
  def getArea(self):
    return self.width * self.height
r = Rectangle(3,4)

实例化r = Rectangle(3, 4)就会出现死循环,因为在__init__里面出现了设置属性值,跳到__setattr__里面e的self.name = value这一句,也就是继续赋值操作self.width = width,所以进入死循环。解决方法:

1) else子句改为:super().__setattr__(name, value)

2) else子句改为:self.__dict__[name] = value

5 描述符:将某种特殊类型的类的实例指派给另一个类的属性

特殊类型是指:

__get__(self, instance, owner):访问属性,返回属性的值

__set__(self, instance, value):用于设置属性,不返回任何内容

__delete__(self, instance):删除属性,不返回任何内容

self:描述符类本身的实例,instance:拥有者类的实例,owner:拥有者,类本身

class MyDecriptor:
  def __get__(self, instance, owner): #理解self instance owner的含义
    print(‘getting...', self, instance, owner)
  def __set__(self, instance, value):
    print(‘setting…',self, instance,value)
  def __delete__(self, instance):
    print(‘deleting…',self, instance)
class Test:
  x = MyDecriptor()
test = Test() #实例化
test.x
test.x = ‘X-man'
del test.x

关于Python相关内容感兴趣的读者可查看本站专题:《Python面向对象程序设计入门与进阶教程》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python编码操作技巧总结》及《Python入门与进阶经典教程》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
在Python中使用zlib模块进行数据压缩的教程
Jun 26 Python
python PIL模块与随机生成中文验证码
Feb 27 Python
Python while 循环使用的简单实例
Jun 08 Python
python 获取当天凌晨零点的时间戳方法
May 22 Python
Python 查看list中是否含有某元素的方法
Jun 27 Python
ubuntu16.04制作vim和python3的开发环境
Sep 23 Python
Django csrf 两种方法设置form的实例
Feb 03 Python
Python批量删除只保留最近几天table的代码实例
Apr 01 Python
python分布式编程实现过程解析
Nov 08 Python
Pycharm2020.1安装中文语言插件的详细教程(不需要汉化)
Aug 07 Python
如何一键升级Python所有包
Nov 05 Python
5分钟快速掌握Python定时任务框架的实现
Jan 26 Python
pymongo中聚合查询的使用方法
Mar 22 #Python
OpenCV HSV颜色识别及HSV基本颜色分量范围
Mar 22 #Python
基于OpenCV python3实现证件照换背景的方法
Mar 22 #Python
详解Python给照片换底色(蓝底换红底)
Mar 22 #Python
详解python-图像处理(映射变换)
Mar 22 #Python
python中如何使用分步式进程计算详解
Mar 22 #Python
浅谈Python基础—判断和循环
Mar 22 #Python
You might like
删除无限级目录与文件代码共享
2006/07/12 PHP
apache+php+mysql安装配置方法小结
2010/08/01 PHP
解析关于wamp启动是80端口被占用的问题
2013/06/21 PHP
php定时计划任务与fsockopen持续进程实例
2014/05/23 PHP
[原创]php求圆周率的简单实现方法
2016/05/30 PHP
laravel5.1框架model类查询的实现方法
2019/10/08 PHP
jquery创建div 实现代码
2009/04/27 Javascript
JavaScript 闭包在封装函数时的简单分析
2009/11/28 Javascript
Visual Studio中的jQuery智能提示设置方法
2010/03/27 Javascript
js判断浏览器类型及设备(移动页面开发)
2015/07/30 Javascript
jquery获取input type=text中的值的各种方式(总结)
2016/12/02 Javascript
深入理解Webpack 中路径的配置
2017/06/17 Javascript
js 获取html5的data属性实现方法
2017/07/28 Javascript
JS实现可针对算术表达式求值的计算器功能示例
2018/09/04 Javascript
vue实现的微信机器人聊天功能案例【附源码下载】
2019/02/18 Javascript
vue实现全匹配搜索列表内容
2019/09/26 Javascript
vue element-ui读取pdf文件的方法
2019/11/26 Javascript
maptalks+three.js+vue webpack实现二维地图上贴三维模型操作
2020/08/10 Javascript
Python中map,reduce,filter和sorted函数的使用方法
2015/08/17 Python
Python2.x版本中基本的中文编码问题解决
2015/10/12 Python
Linux下通过python访问MySQL、Oracle、SQL Server数据库的方法
2016/04/23 Python
Python对文件操作知识汇总
2016/05/15 Python
解析Python中的__getitem__专有方法
2016/06/27 Python
python分析作业提交情况
2017/11/22 Python
Python使用django框架实现多人在线匿名聊天的小程序
2017/11/29 Python
python3使用scrapy生成csv文件代码示例
2017/12/28 Python
Python获取指定字符前面的所有字符方法
2018/05/02 Python
python接口调用已训练好的caffe模型测试分类方法
2019/08/26 Python
Mamaearth官方网站:印度母婴护理产品公司
2019/10/06 全球购物
简历上的自我评价怎么写
2014/01/28 职场文书
创先争优活动承诺书
2014/08/30 职场文书
县长“四风”对照检查材料思想汇报
2014/10/05 职场文书
2014年骨干教师工作总结
2014/12/19 职场文书
2015年政风行风工作总结
2015/04/21 职场文书
关于国庆节的广播稿
2015/08/19 职场文书
PostgreSQL数据库创建并使用视图以及子查询
2022/04/11 PostgreSQL