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中字典和JSON互转操作实例
Jan 19 Python
Python中struct模块对字节流/二进制流的操作教程
Jan 21 Python
对pandas的层次索引与取值的新方法详解
Nov 06 Python
Python 调用 zabbix api的方法示例
Jan 06 Python
Python pip 安装与使用(安装、更新、删除)
Oct 06 Python
Python算法的时间复杂度和空间复杂度(实例解析)
Nov 19 Python
Python使用py2neo操作图数据库neo4j的方法详解
Jan 13 Python
解决Tensorflow 使用时cpu编译不支持警告的问题
Feb 03 Python
Python实现ATM系统
Feb 17 Python
对python中return与yield的区别详解
Mar 12 Python
基于jupyter代码无法在pycharm中运行的解决方法
Apr 21 Python
scrapy-redis分布式爬虫的搭建过程(理论篇)
Sep 29 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 获取mysql数据库信息代码
2009/03/12 PHP
php精确的统计在线人数的方法
2015/10/21 PHP
php while循环控制的简单实例
2016/05/30 PHP
学习并汇集javascript匿名函数
2010/11/25 Javascript
jQuery右键菜单contextMenu使用实例
2011/09/28 Javascript
jquery统计复选框选中示例
2013/11/05 Javascript
ECMAScript6的新特性箭头函数(Arrow Function)详细介绍
2014/06/07 Javascript
JavaScript DOM操作表格及样式
2015/04/13 Javascript
jQuery获取上传文件的名称的正则表达式
2015/05/21 Javascript
jquery 动态合并单元格的实现方法
2016/08/26 Javascript
js实现音频控制进度条功能
2017/04/01 Javascript
完美解决axios跨域请求出错的问题
2018/02/05 Javascript
ExtJs整合Echarts的示例代码
2018/02/27 Javascript
layui的table中显示图片方法
2018/08/17 Javascript
微信小程序版本自动更新的方法
2019/06/14 Javascript
解决python写的windows服务不能启动的问题
2014/04/15 Python
Python中用于转换字母为小写的lower()方法使用简介
2015/05/19 Python
利用Python读取文件的四种不同方法比对
2017/05/18 Python
python发送告警邮件脚本
2018/09/17 Python
使用pandas把某一列的字符值转换为数字的实例
2019/01/29 Python
使用python将mysql数据库的数据转换为json数据的方法
2019/07/01 Python
python3实现微型的web服务器
2019/09/03 Python
浅谈python输出列表元素的所有排列形式
2020/02/26 Python
简单了解Python write writelines区别
2020/02/27 Python
如何在mac版pycharm选择python版本
2020/07/21 Python
Python grpc超时机制代码示例
2020/09/14 Python
雅诗兰黛加拿大官网:Estee Lauder加拿大
2019/07/31 全球购物
最新奶茶店创业计划书范文
2014/02/08 职场文书
群众路线查摆问题整改措施
2014/10/10 职场文书
2014年大学班长工作总结
2014/11/14 职场文书
董事长助理岗位职责
2015/02/11 职场文书
小升初自荐信怎么写
2015/03/26 职场文书
Python使用random模块实现掷骰子游戏的示例代码
2021/04/29 Python
pytorch 运行一段时间后出现GPU OOM的问题
2021/06/02 Python
JS创建或填充任意长度数组的小技巧汇总
2021/10/24 Javascript
【海涛教你打DOTA】虚空假面第一视角骨弓3房29杀
2022/04/01 DOTA