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 除法小技巧
Sep 06 Python
Python XML RPC服务器端和客户端实例
Nov 22 Python
举例讲解如何在Python编程中进行迭代和遍历
Jan 19 Python
单链表反转python实现代码示例
Feb 08 Python
Python对象中__del__方法起作用的条件详解
Nov 01 Python
浅谈python 读excel数值为浮点型的问题
Dec 25 Python
Python面向对象程序设计中类的定义、实例化、封装及私有变量/方法详解
Feb 28 Python
Ubuntu下Python+Flask分分钟搭建自己的服务器教程
Nov 19 Python
python GUI库图形界面开发之PyQt5 Qt Designer工具(Qt设计师)详细使用方法及Designer ui文件转py文件方法
Feb 26 Python
Tensorflow实现将标签变为one-hot形式
May 22 Python
python如何求100以内的素数
May 27 Python
基于tensorflow for循环 while循环案例
Jun 30 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
谈谈PHP语法(2)
2006/10/09 PHP
PHP+SQL 注入攻击的技术实现以及预防办法
2011/01/27 PHP
利用curl抓取远程页面内容的示例代码
2013/07/23 PHP
php中用socket模拟http中post或者get提交数据的示例代码
2013/08/08 PHP
WordPress中访客登陆实现邮件提醒的PHP脚本实例分享
2015/12/14 PHP
简单谈谈PHP中的include、include_once、require以及require_once语句
2016/04/23 PHP
PHP获取链表中倒数第K个节点的方法
2018/01/18 PHP
PHP PDOStatement::bindParam讲解
2019/01/30 PHP
浅析PHP中json_encode与json_decode的区别
2020/07/15 PHP
Prototype源码浅析 String部分(三)之HTML字符串处理
2012/01/15 Javascript
jquery ajax提交整个表单元素的快捷办法
2013/03/27 Javascript
jquery实现点击弹出层效果的简单实例
2014/03/03 Javascript
JavaScript极简入门教程(三):数组
2014/10/25 Javascript
jQuery实现仿淘宝带有指示条的图片转动切换效果完整实例
2015/03/04 Javascript
JavaScript实现添加、查找、删除元素
2015/07/02 Javascript
jQuery+formdata实现上传进度特效遇到的问题
2016/02/24 Javascript
微信小程序 表单Form实例详解(附源码)
2016/12/22 Javascript
ES6新特性七:数组的扩充详解
2017/04/21 Javascript
Angular angular-file-upload文件上传的示例代码
2018/08/23 Javascript
[05:20]卡尔工作室_DOTA2新手教学_DOTA2超强新手功能
2013/04/22 DOTA
[04:26]2014DOTA2西雅图国际邀请赛 总决赛TOPPLAY
2014/07/22 DOTA
Python模拟登录12306的方法
2014/12/30 Python
python使用Turtle库绘制动态钟表
2018/11/19 Python
对PyQt5中的菜单栏和工具栏实例详解
2019/06/20 Python
CSS3字体效果的设置方法小结
2016/06/13 HTML / CSS
台湾母婴用品购物网站:Infant婴之房
2018/06/15 全球购物
NFL加拿大官方网上商店:NHLShop.ca
2019/03/12 全球购物
面向对象编程的优势是什么
2015/12/17 面试题
爱祖国演讲稿
2014/05/04 职场文书
初中优秀学生评语
2014/12/29 职场文书
工作表扬信范文
2015/01/17 职场文书
2015年世界无烟日活动方案
2015/05/04 职场文书
2015年学校总务处工作总结
2015/05/19 职场文书
党员电教片《信仰》心得体会
2016/01/15 职场文书
导游词之镇江焦山
2019/11/21 职场文书
python中使用 unittest.TestCase单元测试的用例详解
2021/08/30 Python