本文实例讲述了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程序设计有所帮助。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- [发烧人声]群星《邂逅》DTS-WAV
- 艻打绿《夏/狂热(苏打绿版)》[320K/MP3][106.42MB]
- 艻打绿《夏/狂热(苏打绿版)》[FLAC分轨][574.2MB]
- 黄雨勳《魔法列车首部曲》[320K/MP3][33.1MB]
- 李蕙敏.2014-记得·销魂新歌+精丫乐意唱片】【WAV+CUE】
- 谢金燕.1995-含泪跳恰蔷冠登】【WAV+CUE】
- 于文文.2024-天蝎座【华纳】【FLAC分轨】
- 黄雨勳《魔法列车首部曲》[FLAC/分轨][173.61MB]
- 群星《歌手2024 第13期》[320K/MP3][50.09MB]
- 群星《歌手2024 第13期》[FLAC/分轨][325.93MB]
- 阿木乃《爱情买卖》DTS-ES【NRG镜像】
- 江蕾《爱是这样甜》DTS-WAV
- VA-Hair(OriginalBroadwayCastRecording)(1968)(PBTHAL24-96FLAC)
- 博主分享《美末2RE》PS5 Pro运行画面 玩家仍不买账
- 《双城之战2》超多新歌MV发布:林肯公园再次献声