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构造icmp echo请求和实现网络探测器功能代码分享
Jan 10 Python
Python编程对列表中字典元素进行排序的方法详解
May 26 Python
Python获取SQLite查询结果表列名的方法
Jun 21 Python
python中requests使用代理proxies方法介绍
Oct 25 Python
Django开发中复选框用法示例
Mar 20 Python
Python Pandas找到缺失值的位置方法
Apr 12 Python
Python 实现删除某路径下文件及文件夹的实例讲解
Apr 24 Python
Anaconda下配置python+opencv+contribx的实例讲解
Aug 06 Python
Django 在iframe里跳转顶层url的例子
Aug 21 Python
Pytorch 中retain_graph的用法详解
Jan 07 Python
python中的split、rsplit、splitlines用法说明
Oct 23 Python
python设置中文界面实例方法
Oct 27 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
PHP4(windows版本)中的COM函数
2006/10/09 PHP
很实用的一个完整email发送程序
2006/10/09 PHP
解析thinkphp的左右值无限分类
2013/06/20 PHP
[原创]js与自动伸缩图片 自动缩小图片的多浏览器兼容的方法总结
2007/03/12 Javascript
js textarea自动增高并隐藏滚动条
2009/12/16 Javascript
JQuery给元素添加/删除节点比如select
2013/04/02 Javascript
Javascript前端UI框架Kit使用指南之kitjs的对话框组件
2014/11/28 Javascript
jQuery中noConflict()用法实例分析
2015/02/08 Javascript
JavaScript实现获得所有兄弟节点的方法
2015/07/23 Javascript
JavaScript运行过程中的“预编译阶段”和“执行阶段”
2015/12/16 Javascript
异步加载JS、CSS代码(推荐)
2016/06/15 Javascript
JavaScript之DOM插入更新删除_动力节点Java学院整理
2017/07/03 Javascript
关于vue.extend和vue.component的区别浅析
2017/08/16 Javascript
为什么要使用Vuex的介绍
2019/01/19 Javascript
对layui数据表格动态cols(字段)动态变化详解
2019/10/25 Javascript
vue excel上传预览和table内容下载到excel文件中
2019/12/10 Javascript
python异步任务队列示例
2014/04/01 Python
python实现sublime3的less编译插件示例
2014/04/27 Python
python写的一个squid访问日志分析的小程序
2014/09/17 Python
Python正则简单实例分析
2017/03/21 Python
Python中装饰器学习总结
2018/02/10 Python
解决Pandas的DataFrame输出截断和省略的问题
2019/02/08 Python
详解python深浅拷贝区别
2019/06/24 Python
python覆盖写入,追加写入的实例
2019/06/26 Python
将数据集制作成VOC数据集格式的实例
2020/02/17 Python
Python标准库json模块和pickle模块使用详解
2020/03/10 Python
Django中的AutoField字段使用
2020/05/18 Python
html5 input元素新特性_动力节点Java学院整理
2017/07/06 HTML / CSS
Html5实现如何在两个div元素之间拖放图像
2013/03/29 HTML / CSS
Tommy Hilfiger美国官网:美国高端休闲领导品牌
2019/01/14 全球购物
介绍JAVA 中的Collection FrameWork(及如何写自己的数据结构)
2014/10/31 面试题
信电学院毕业生自荐书
2014/05/24 职场文书
2015年五一劳动节慰问信
2015/03/23 职场文书
python元组打包和解包过程详解
2021/08/02 Python
如何通过简单的代码描述Angular父组件、子组件传值
2022/04/07 Javascript
深入理解pytorch库的dockerfile
2022/06/10 Python