博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python 面向对象 特殊方法(魔法方法)
阅读量:4552 次
发布时间:2019-06-08

本文共 4611 字,大约阅读时间需要 15 分钟。

Python 的特殊方法,两边带双下划线的方法。

比如:__init__(self, ...)、__del__(self)

1、__init__(self,...) : 构造方法

  __init__(self, ...)  构造方法,这个方法在创建对象时,自动触发执行。实例化类格式: 类名() 

class Phone:    def __init__(self, brand, year):        self.brand = brand        self.year = year        print("执行 __init__ 方法")p = Phone('小米', 2018)   # 自动执行类中的 __init__ 方法结果:执行 __init__ 方法
View Code

2、__del__(self):析构方法

  析构方法,当对象在内存中被释放时,或者手动调用del方法,自动触发执行。

  注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,

    因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。

>>> class Phone:    def __init__(self, brand, year):        self.brand = brand        self.year = year        print("执行 __init__ 方法")    def __del__(self):        print("执行 __del__ 方法")        >>> p = Phone('小米', 2018)   # 自动执行类中的 __init__ 方法执行 __init__ 方法>>> del p执行 __del__ 方法>>>
View Code

3、__new__(): 定义如何创建对象

  类名() 创建对象时,在自动执行 __init__()方法前,会先执行 object.__new__方法,在内存中开辟对象空间并返回

>>> class Phone:    def __init__(self, brand, year):        self.brand = brand        self.year = year        print("执行 __init__ 方法")    def __new__(cls, *args, **kwargs):        print("执行 __new__ 方法")        return object.__new__(cls)    >>> p = Phone('小米', 2018)   # 自动执行类中的 __init__ 方法执行 __new__ 方法执行 __init__ 方法>>>1 类名() 执行object.__new__方法,在内存中开辟对象空间并返回;2 自动执行__init__方法,将对象空间创给self;3 在__init__给对象封装属性。
View Code
# 单例模式: 一个类只能实例化一个对象class Phone:    __instance = None    def __init__(self, brand, year):        self.brand = brand        self.year = year    def __new__(cls, *args, **kwargs):        if cls.__instance is None:            cls.__instance = object.__new__(cls)        return cls.__instancep1 = Phone('小米', 2018)p2 = Phone('华为', 2017)p3 = Phone('魅族', 2016)print(p1)print(p2)print(p3)结果:<__main__.Phone object at 0x000001C5B2286160><__main__.Phone object at 0x000001C5B2286160><__main__.Phone object at 0x000001C5B2286160>
View Code

 4、__module__ 和 __class__

  __module__ : 表示当前操作的对象在那个模块,本模块 : __main__

  __class__     : 表示当前操作的对象的类是什么

>>> class Phone:    def __init__(self, brand, year):        self.brand = brand        self.year = year        >>> p = Phone('小米', 2018)>>> p.__module__'__main__'>>> p.__class__
>>>
View Code

5、__call__

  __call__:对象后面加括号,触发执行。

>>> class Phone:    def __init__(self):        pass    def __call__(self, *args, **kwargs):        print('执行 __call__ 方法')        >>> p = Phone()>>> p()执行 __call__ 方法>>>
View Code

6. __dict__

  类或对象中的所有成员

   类的普通字段属于对象;类中的静态字段和方法等属于类:

class Province:    country = 'China'    def __init__(self, name, count):        self.name = name        self.count = count    def func(self, *args, **kwargs):        print 'func'# 获取类的成员,即:静态字段、方法、print Province.__dict__# 输出:{'country': 'China', '__module__': '__main__', 'func': 
, '__init__':
, '__doc__': None}obj1 = Province('河北',10000)print obj1.__dict__# 获取 对象obj1 的成员# 输出:{'count': 10000, 'name': '河北'}obj2 = Province('河南', 3888)print obj2.__dict__# 获取 对象obj2 的成员# 输出:{'count': 3888, 'name': '河南'}

 7. __str__

  如果一个类中定义了__str__方法,那么在打印 对象 (对象序列化)时,默认输出该方法的返回值。

>>> class Scholar:	def __str__(self):		return "富贵不能淫,贫贱不能移,威武不能屈"	>>> eagle = Scholar()>>> print (eagle)富贵不能淫,贫贱不能移,威武不能屈>>>

8、__getitem__、__setitem__、__delitem__

用于索引操作,如字典。以上分别表示获取、设置、删除数据

#!/usr/bin/env python class skill(object):     def __getitem__(self, key):        print('__getitem__', key)     def __setitem__(self, key, value):        print('__setitem__', key, value)     def __delitem__(self, key):        print('__delitem__', key)  s= skill() talent= s['k1']       # 自动触发执行 __getitem__s['k2'] = 'swim'      # 自动触发执行 __setitem__del s['k1']           # 自动触发执行 __delitem__

9. __iter__ 

用于迭代器,之所以列表、字典、元组可以进行for循环,是因为类型内部定义了 __iter__ 

>>> class employees:	pass>>> emps = employees()>>> for emp in emps:	print(emp)报错:    for emp in emps: TypeError: 'employees' object is not iterable
>>> class employees:	def __iter__(self):		pass	>>> emps2 = employees()>>> for emp in emps2:	print(emp)Traceback (most recent call last):  File "
", line 1, in
for emp in emps2:TypeError: iter() returned non-iterator of type 'NoneType'>>>
>>> class fruits:	def __init__(self, name_list):		self._name_list = name_list	def __iter__(self):		return iter(self._name_list)>>> apple = fruits(["红富士","嘎拉","黄元帅","红星"])>>> for i in apple:	print(i)红富士嘎拉黄元帅红星>>>

以上步骤可以看出,for循环迭代的其实是  iter(["红富士","嘎拉","黄元帅","红星"]) ,所以执行流程可以变更为:

>>> apps = iter(["红富士","嘎拉","黄元帅","红星"])>>> >>> for app in apps:	print(app)	红富士嘎拉黄元帅红星>>>
obj = iter(["红富士","嘎拉","黄元帅","红星"])while True:    val = obj.next()    print(val)For循环语法内部实现

转载于:https://www.cnblogs.com/51try-again/p/10403577.html

你可能感兴趣的文章
urllib 学习一
查看>>
bzoj4196 [Noi2015]软件包管理器——树链剖分
查看>>
kafka源码阅读环境搭建
查看>>
UI设计
查看>>
androidtab
查看>>
Windows Phone 自定义弹出框和 Toast 通知
查看>>
如何生成静态页面的五种方案
查看>>
php 事件驱动 消息机制 共享内存
查看>>
剑指offer 二叉树的bfs
查看>>
LeetCode Maximum Subarray
查看>>
Ubuntu 14.04 更新源
查看>>
kafka生产者与消费者
查看>>
单元测试框架"艾信.NET单元测试工具(AssionUnit)"开发---第二步
查看>>
git 项目最常用命令总结
查看>>
[Arduino] 在串口读取多个字符串,并且转换为数字数组
查看>>
redis-window 集群配置
查看>>
4.1.6 Grundy数-硬币游戏2
查看>>
图像处理的软件
查看>>
Sql 2000系统表 语句查询表结构
查看>>
[CentOS_7.4]Linux编译安装ffmpeg
查看>>