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自然语言编码转换模块codecs介绍
Apr 08 Python
Zabbix实现微信报警功能
Oct 09 Python
老生常谈Python之装饰器、迭代器和生成器
Jul 26 Python
Python中将变量按行写入txt文本中的方法
Apr 03 Python
python调用摄像头拍摄数据集
Jun 01 Python
anaconda如何查看并管理python环境
Jul 05 Python
详解从Django Allauth中进行登录改造小结
Dec 18 Python
python网络编程:socketserver的基本使用方法实例分析
Apr 09 Python
Keras 在fit_generator训练方式中加入图像random_crop操作
Jul 03 Python
python3环境搭建过程(利用Anaconda+pycharm)完整版
Aug 19 Python
使用pandas生成/读取csv文件的方法实例
Jul 09 Python
Pyhton爬虫知识之正则表达式详解
Apr 01 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中使用json数据格式定义字面量对象的方法
2014/08/20 PHP
PHP实现的简单分页类及用法示例
2016/05/06 PHP
thinkPHP框架中layer.js的封装与使用方法示例
2019/01/18 PHP
PHP代码覆盖率统计详解
2020/07/22 PHP
JavaScript设置首页和收藏页面的小例子
2013/11/11 Javascript
jquery Validation表单验证使用详解
2020/09/12 Javascript
JS实现为排序好的字符串找出重复行的方法
2016/03/02 Javascript
有关jquery与DOM节点操作方法和属性记录
2016/04/15 Javascript
总结javascript中的六种迭代器
2016/08/16 Javascript
Javascript 实现简单计算器实例代码
2016/10/23 Javascript
js实现文字选中分享功能
2017/01/25 Javascript
在 Angular 中实现搜索关键字高亮示例
2017/03/21 Javascript
Angular.js 4.x中表单Template-Driven Forms详解
2017/04/25 Javascript
js 获取html5的data属性实现方法
2017/07/28 Javascript
微信小程序上传图片到服务器实例代码
2017/11/07 Javascript
JS运动特效之完美运动框架实例分析
2018/01/24 Javascript
对vue事件的延迟执行实例讲解
2018/08/28 Javascript
vue鼠标悬停事件实例详解
2019/04/01 Javascript
JS实现获取当前所在周的周六、周日示例分析
2019/05/11 Javascript
React Ant Design树形表格的复杂增删改操作
2020/11/02 Javascript
Python实现动态添加类的属性或成员函数的解决方法
2014/07/16 Python
Python网络爬虫与信息提取(实例讲解)
2017/08/29 Python
python opencv实现运动检测
2018/07/10 Python
Python List cmp()知识点总结
2019/02/18 Python
Django框架会话技术实例分析【Cookie与Session】
2019/05/24 Python
Tensorflow 使用pb文件保存(恢复)模型计算图和参数实例详解
2020/02/11 Python
CSS3中的opacity属性使用教程
2015/08/19 HTML / CSS
h5封装下拉刷新
2020/08/25 HTML / CSS
幼儿园园长岗位职责
2013/11/26 职场文书
汽车维修专业毕业生的求职信分享
2013/12/04 职场文书
运动会邀请函范文
2014/01/31 职场文书
大学生个人先进事迹材料范文
2014/05/03 职场文书
师德模范事迹材料
2014/06/03 职场文书
爱与责任师德演讲稿
2014/08/26 职场文书
乒乓球比赛通知
2015/04/27 职场文书
springboot @ConfigurationProperties和@PropertySource的区别
2021/06/11 Java/Android