当前位置:脚本大全 > > 正文

python实战方法(Python常用特殊方法实例总结)

时间:2021-11-04 19:40:36类别:脚本大全

python实战方法

Python常用特殊方法实例总结

本文实例讲述了Python常用特殊方法。分享给大家供大家参考,具体如下:

1 __init__和__new__

__init__方法用来初始化类实例;__new__方法用来创建类实例。

主要的区别:

1).__init__通常用于初始化一个新实例,控制初始化的过程,发生在类实例被创建完以后。它是实例级别的方法。

2).__new__通常用于控制生成一个新实例的过程。它是类级别的方法。

__new__具体的作用:

1) 继承一些不可变的class时(比如int, str, tuple),提供一个自定义这些类的实例化过程的途径

2) 实现自定义的metaclass

例子:实现永远返回正数

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 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__方法

    当对象所有的引用都被删除后触发该方法,代码如下:

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 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__,如下:

  • ?
  • 1
  • __repr__ = __str__
  • 4 属性访问

    __getattr__(self, name):当用户试图获取一个不存在的属性(name)时的行为

    __getattribute__(self, name):当类的属性被访问时的行为

    __setattr__(self, name, value):当一个属性被设置时的行为

    __delattr__(self, name):当一个属性被删除时的行为

    死循环陷阱:

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 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:拥有者,类本身

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 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程序设计有所帮助。

    原文链接:https://blog.csdn.net/heshiliqiu/article/details/82529554

    上一篇下一篇

    猜您喜欢

    热门推荐