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实现一个简单的多线程TCP服务器的教程
May 05 Python
一个基于flask的web应用诞生 flask和mysql相连(4)
Apr 11 Python
Python 解决中文写入Excel时抛异常的问题
May 03 Python
mvc框架打造笔记之wsgi协议的优缺点以及接口实现
Aug 01 Python
python对html过滤处理的方法
Oct 21 Python
python list转置和前后反转的例子
Aug 26 Python
Python搭建代理IP池实现存储IP的方法
Oct 27 Python
python数据化运营的重要意义
Nov 25 Python
Matplotlib自定义坐标轴刻度的实现示例
Jun 18 Python
Python中logging日志记录到文件及自动分割的操作代码
Aug 05 Python
python中温度单位转换的实例方法
Dec 27 Python
基于Python-Pycharm实现的猴子摘桃小游戏(源代码)
Feb 20 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数据库的基本类代码
2014/02/25 PHP
有关DOM元素与事件的3个谜题
2010/11/11 Javascript
MooTools 页面滚动浮动层智能定位实现代码
2011/08/23 Javascript
jquery的attr方法禁用表单元素禁用输入内容
2014/06/23 Javascript
js键盘事件的keyCode
2014/07/29 Javascript
JavaScript中string转换成number介绍
2014/12/31 Javascript
jQuery实现向下滑出的平滑下拉菜单效果
2015/08/21 Javascript
js运动应用实例解析
2015/12/28 Javascript
javascript+html5+css3自定义提示窗口
2017/06/21 Javascript
NodeJS使用七牛云存储上传文件的方法
2017/07/24 NodeJs
浅谈Vuejs Prop基本用法
2017/08/17 Javascript
动态统计当前输入内容的字节、字符数的实例详解
2017/10/27 Javascript
js 提取某()特殊字符串长度的实例
2017/12/06 Javascript
vue select组件的使用与禁用实现代码
2018/04/10 Javascript
详解JS函数stack size计算方法
2018/06/18 Javascript
详解使用React制作一个模态框
2019/03/14 Javascript
简单分析js中的this的原理
2019/08/31 Javascript
vue+ESLint 配置保存 自动格式化代码
2020/03/17 Javascript
JavaScript实现雪花飘落效果
2020/12/27 Javascript
详解Vue2的diff算法
2021/01/06 Vue.js
Python实现学生成绩管理系统
2020/04/05 Python
python正则表达式面试题解答
2020/04/28 Python
Python3之手动创建迭代器的实例代码
2019/05/22 Python
分析运行中的 Python 进程详细解析
2019/06/22 Python
django迁移数据库错误问题解决
2019/07/29 Python
Python decimal模块使用方法详解
2020/06/08 Python
详解tensorflow之过拟合问题实战
2020/11/01 Python
HTML5新增的8类INPUT输入类型介绍
2015/07/06 HTML / CSS
成功的餐厅经营创业计划书
2014/01/15 职场文书
捐款倡议书范文
2014/02/02 职场文书
房产继承公证书
2014/04/09 职场文书
党的群众路线对照检查材料
2014/08/27 职场文书
西安大雁塔导游词
2015/02/10 职场文书
远程教育学习心得体会
2016/01/23 职场文书
人事行政部各岗位职责说明书!
2019/07/15 职场文书
JavaScript 实现页面滚动动画
2021/04/24 Javascript