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__ 方法

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__ 方法
>>>

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__给对象封装属性。
# 单例模式: 一个类只能实例化一个对象
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.__instance p1 = 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>

 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__
<class '__main__.Phone'>
>>>

5、__call__

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

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

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': <function func at 0x10be30f50>, '__init__': <function __init__ at 0x10be30ed8>, '__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 "<pyshell#27>", line 1, in <module>
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循环语法内部实现

Python 面向对象 特殊方法(魔法方法)的更多相关文章

  1. 『无为则无心』Python面向对象 — 59、魔法方法

    目录 1.魔法方法__new__() 2.魔法方法__init__() 3.魔法方法__del__() 4.魔法方法__str__()和__repr__() 5.魔法方法__call__() 6.魔法 ...

  2. python 面向对象的一些魔法方法和反射

    1.with和__enter__,__exit__,__init__配合使用class A: def __init__(self): print('init') def __enter__(self) ...

  3. python基础语法18 类的内置方法(魔法方法),单例模式

    类的内置方法(魔法方法): 凡是在类内部定义,以__开头__结尾的方法,都是类的内置方法,也称之为魔法方法. 类的内置方法,会在某种条件满足下自动触发. 内置方法如下: __new__: 在__ini ...

  4. 面向对象相关概念与在python中的面向对象知识(魔法方法+反射+元类+鸭子类型)

    面向对象知识 封装 封装的原理是,其成员变量代表对象的属性,方法代表这个对象的动作真正的封装是,经过深入的思考,做出良好的抽象(设计属性时用到),给出“完整且最小”的接口,并使得内部细节可以对外透明( ...

  5. python 面向对象进阶之内置方法

    一 isinstance(obj,cls)和issubclass(sub,super) 1.1,isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(obj ...

  6. python进阶之类常用魔法方法和魔法属性

    前言 前面我们总结过了python的关键字.运算符.内置函数.语法糖等与python魔法方法之间的关系,现在我们更细一点,看看python的面向对象编程有哪些常用的魔法属性和魔法方法. 魔法属性 对于 ...

  7. python:类3——魔法方法

    一.魔法方法特点 被双上下滑线包围 魔法方法是面向对象的Python的一切,如果你不知道魔法方法,说明你还没能意识到面向对象的Python的强大(不是说Python脚本) 通过对制定方法的重写,完全可 ...

  8. python面向对象双下划线方法与元类

    目录 双下划线方法(__) 元类简介 产生类的两种表现形式 元类的基本使用 元类进阶操作 __new__方法 双下划线方法(__) 面向对象中的双下方法也有一些人称之为是魔法方法,有些双下方法不需要刻 ...

  9. python 面向对象类成员(字段 方法 属性)

    一.字段 字段包括:普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同, 普通字段属于对象 静态字段属于类 class Province: # 静态字段 countr ...

  10. 『无为则无心』Python面向对象 — 60、魔法属性

    目录 1.魔法属性__name__ 2.魔法属性__bases__ 3.魔法属性__mro__ 4.魔法属性__doc__ 5.魔法属性__module__ 和__class__ 6.魔法属性__di ...

随机推荐

  1. CS231n 2016 通关 第二章-KNN 作业分析

    KNN作业要求: 1.掌握KNN算法原理 2.实现具体K值的KNN算法 3.实现对K值的交叉验证 1.KNN原理见上一小节 2.实现KNN 过程分两步: 1.计算测试集与训练集的距离 2.通过比较la ...

  2. vmware实现与windows下的共享文件

    1 首先你得先设置一下windows下得共享 比如是准备共享D盘 那么右击 ----->属性------->高级共享勾上就OK勒 2那么vmware怎么设置呢? 打开vmware-> ...

  3. Mac系统下源码编译安装MySQL 5.7.17

    1.下载并解压到:/Users/xiechunping/Softwares/mysql-5.7.17下载地址:http://ftp.ntu.edu.tw/pub/MySQL/Downloads/MyS ...

  4. Eclipse中,Open Type(Ctrl+Shift+T)失效后做法。

    好几天ctrl shift T都不好用了,一直认为是工程的问题,没太在意,反正ctrl shift R也可也,今天看同事的好用,于是到网上查了一下解决的方法,刚才试了一下,应该是这个问题,明天就去公司 ...

  5. OC静态代码检查实战

    此文已由作者杨晓授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 在Mac OS系统上,采用Xcodebuild Analyze命令和OClint工具,对iOS项目进行静态代码 ...

  6. spoj LCS2 - Longest Common Substring II && LCS - Longest Common Substring【SAM】

    多串LCS很适合SA但是我要学SAM 对第一个串求SAM,然后把剩下的串在SAM上跑,也就是维护p和len,到一个点,如果有ch[p][c],就p=ch[p][c],len++,否则向fa找最下的有c ...

  7. kibana 操作

    插入时不指明id,不会自动生成id,和视频中的不一样啊 解决: 其实是可以的,不过put不可以 POST才可以 中文输入有问题: 待解决: 基本操作记录 GET _search { "que ...

  8. hud3371 Connect the Cities 简单最小生成树

    //我看过Discuss说不能用克鲁斯卡尔因为有很多边 //但是只能用G++过,C++的确超时 #include <stdio.h> #include <string.h> # ...

  9. div里面放img

    div里面放img的时候 会出现包裹不住的情况,这个时候 只要将img { width:100%,height:100%  },就可以解决问题了

  10. AVL树(平衡二叉树)

    定义及性质 AVL树:AVL树是一颗自平衡的二叉搜索树. AVL树具有以下性质: 根的左右子树的高度只差的绝对值不能超过1 根的左右子树都是 平衡二叉树(AVL树) 百度百科: 平衡二叉搜索树(Sel ...