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中的mock库对Python代码进行模拟测试
Apr 16 Python
在Python中用has_key()方法查找键是否存在的教程
May 21 Python
使用Python内置的模块与函数进行不同进制的数的转换
Mar 12 Python
python微信跳一跳系列之色块轮廓定位棋盘
Feb 26 Python
Selenium的使用详解
Oct 19 Python
python 使用正则表达式按照多个空格分割字符的实例
Dec 20 Python
Python 实现输入任意多个数,并计算其平均值的例子
Jul 16 Python
Python数据分析模块pandas用法详解
Sep 04 Python
Java Spring项目国际化(i18n)详细方法与实例
Mar 20 Python
python时间序列数据转为timestamp格式的方法
Aug 03 Python
pytorch 权重weight 与 梯度grad 可视化操作
Jun 05 Python
浅析python中特殊文件和特殊函数
Feb 24 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
Snoopy类使用小例子
2008/04/15 PHP
删除无限分类并同时删除它下面的所有子分类的方法
2010/08/08 PHP
php邮件发送,php发送邮件的类
2011/03/24 PHP
php tp验证表单与自动填充函数代码
2012/02/22 PHP
如何使用php绘制在图片上的正余弦曲线
2013/06/08 PHP
PHP设计模式之解释器模式的深入解析
2013/06/13 PHP
PHP扩展开发教程(总结)
2015/11/04 PHP
php+redis消息队列实现抢购功能
2018/02/08 PHP
JsEasy简介 JsEasy是什么?与下载
2007/03/07 Javascript
multiSteps 基于Jquery的多步骤滑动切换插件
2011/07/22 Javascript
jQuery.fn和jQuery.prototype区别介绍
2013/10/05 Javascript
jQuery读取和设定KindEditor值的方法
2013/11/22 Javascript
浅谈JavaScript 框架分类
2014/11/10 Javascript
JavaScript实现的一个日期格式化函数分享
2014/12/06 Javascript
调试JavaScript中正则表达式中遇到的问题
2015/01/27 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形网络(1)
2015/11/30 Javascript
AngularJS实现全选反选功能
2015/12/08 Javascript
基于javascript实现表格的简单操作
2016/05/21 Javascript
利用jsonp跨域调用百度js实现搜索框智能提示
2016/08/24 Javascript
JS 调用微信扫一扫功能
2016/12/22 Javascript
详解ES6语法之可迭代协议和迭代器协议
2018/01/13 Javascript
详解在不使用ssr的情况下解决Vue单页面SEO问题
2018/11/08 Javascript
VUE 实现复制内容到剪贴板的两种方法
2019/04/24 Javascript
在Vue中获取自定义属性方法:data-id的实例
2020/09/09 Javascript
[08:56]DOTA2-DPC中国联赛2月23日Recap集锦
2021/03/11 DOTA
栈和队列数据结构的基本概念及其相关的Python实现
2015/08/24 Python
对python中的for循环和range内置函数详解
2018/04/17 Python
Python Web程序搭建简单的Web服务器
2019/07/31 Python
python shutil文件操作工具使用实例分析
2019/12/25 Python
pandas dataframe 中的explode函数用法详解
2020/05/18 Python
Pycharm中使用git进行合作开发的教程详解
2020/11/17 Python
小学教师的个人自我鉴定
2013/10/24 职场文书
历史专业个人求职信分享
2013/12/20 职场文书
2015年销售助理工作总结
2015/05/11 职场文书
高一语文教学反思
2016/02/16 职场文书
利用html+css实现菜单栏缓慢下拉效果的示例代码
2021/03/30 HTML / CSS