Python常用特殊方法实例总结

作者:AutumnBegins 时间:2021-06-16 16:06:41 

本文实例讲述了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程序设计有所帮助。

来源:https://blog.csdn.net/heshiliqiu/article/details/82529554

标签:Python,特殊方法,描述符
0
投稿

猜你喜欢

  • SQL触发器定义与使用

    2024-01-28 09:21:27
  • PHP实现登录的Cookie存储方案详解

    2023-05-25 08:45:17
  • Python接单的过程记录分享

    2022-05-24 13:33:23
  • python rsync服务器之间文件夹同步脚本

    2023-02-23 05:05:56
  • 通过优化CSS代码 减小对系统资源的占用

    2010-08-03 12:33:00
  • DW CS4初步试用感受

    2008-05-30 12:17:00
  • python实现ftp文件传输功能

    2023-04-21 13:20:16
  • python实现时间o(1)的最小栈的实例代码

    2021-08-01 15:24:42
  • conda查看、创建、删除、激活与退出环境命令详解

    2022-02-25 19:11:09
  • python调用jenkinsAPI构建jenkins,并传递参数的示例

    2023-08-09 13:13:55
  • Python全局变量操作详解

    2022-04-18 04:22:00
  • python数据归一化及三种方法详解

    2023-02-28 01:48:40
  • python基础面试题整理

    2023-11-03 02:09:45
  • 如何用python多次调用exe文件运行不同的结果

    2023-07-08 03:01:24
  • 在python里协程使用同步锁Lock的实例

    2022-07-31 14:26:04
  • Python matplotlib 绘制双Y轴曲线图的示例代码

    2023-04-14 11:07:27
  • Javascript:keyCode键盘键码值表

    2008-02-21 13:16:00
  • php 多继承的几种常见实现方法示例

    2023-11-22 19:03:19
  • 基于go手动写个转发代理服务的代码实现

    2024-04-25 15:11:15
  • ThinkPHP函数详解之M方法和R方法

    2023-11-22 12:00:25
  • asp之家 网络编程 m.aspxhome.com