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多进程通信Queue、Pipe、Value、Array实例
Nov 21 Python
Python标准库之collections包的使用教程
Apr 27 Python
Python读取excel指定列生成指定sql脚本的方法
Nov 28 Python
python调用c++传递数组的实例
Feb 13 Python
Python简单I/O操作示例
Mar 18 Python
Python安装Flask环境及简单应用示例
May 03 Python
Python简单处理坐标排序问题示例
Jul 11 Python
对Django的restful用法详解(自带的增删改查)
Aug 28 Python
解决pycharm中导入自己写的.py函数出错问题
Feb 12 Python
Python修改列表值问题解决方案
Mar 06 Python
Pytest allure 命令行参数的使用
Apr 18 Python
关于的python五子棋的算法
May 02 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批量生成缩略图的代码
2008/07/19 PHP
ThinkPHP自动验证失败的解决方法
2011/06/09 PHP
PHP 循环删除无限分类子节点的实现代码
2013/06/21 PHP
php格式输出文件var_export函数实例
2014/11/15 PHP
PHP线程的内存回收问题
2016/07/08 PHP
PHP文件操作实例总结
2016/09/27 PHP
详解php 使用Callable Closure强制指定回调类型
2017/10/26 PHP
得到文本框选中的文字,动态插入文字的js代码
2007/03/07 Javascript
原生js写的放大镜效果
2012/08/22 Javascript
浅析jquery某一元素重复绑定的问题
2014/01/03 Javascript
js中的cookie的读写操作示例详解
2014/04/17 Javascript
javascript实现的猜数小游戏完整实例代码
2016/05/10 Javascript
js输出数据精确到小数点后n位代码
2016/07/02 Javascript
使用jquery实现的循环连续可停顿滚动实例
2016/11/23 Javascript
jQueryUI Sortable 应用Demo(分享)
2017/09/07 jQuery
Vue中的异步组件函数实现代码
2018/07/20 Javascript
深入浅析vue-cli@3.0 使用及配置说明
2019/05/08 Javascript
vue中监听返回键问题
2019/08/28 Javascript
构建一个JavaScript插件系统
2020/10/20 Javascript
python冒泡排序算法的实现代码
2013/11/21 Python
python解决Fedora解压zip时中文乱码的方法
2016/09/18 Python
Python基于FTP模块实现ftp文件上传操作示例
2018/04/23 Python
python实现感知机线性分类模型示例代码
2019/06/02 Python
python pandas cumsum求累计次数的用法
2019/07/29 Python
OpenCV里的imshow()和Matplotlib.pyplot的imshow()的实现
2019/11/25 Python
纯CSS实现颜色渐变效果(包含环形渐变、线性渐变、彩虹效果等)
2014/05/07 HTML / CSS
Parfumdreams英国:香水和化妆品
2019/05/10 全球购物
巴西Mr. Cat在线商店:购买包包和鞋子
2019/09/08 全球购物
个人自我评价和职业目标
2014/01/24 职场文书
合作意向协议书范本
2014/03/31 职场文书
2014财产信托协议书范本
2014/11/18 职场文书
2016教师给学生的毕业寄语
2015/12/04 职场文书
Python中seaborn库之countplot的数据可视化使用
2021/06/11 Python
详解MongoDB的条件查询和排序
2021/06/23 MongoDB
微信小程序scroll-view不能左右滑动问题的解决方法
2021/07/09 Javascript
nginx sticky实现基于cookie负载均衡示例详解
2022/12/24 Servers