Python 面向对象 特殊方法(魔法方法)
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 面向对象 特殊方法(魔法方法)的更多相关文章
- 『无为则无心』Python面向对象 — 59、魔法方法
目录 1.魔法方法__new__() 2.魔法方法__init__() 3.魔法方法__del__() 4.魔法方法__str__()和__repr__() 5.魔法方法__call__() 6.魔法 ...
- python 面向对象的一些魔法方法和反射
1.with和__enter__,__exit__,__init__配合使用class A: def __init__(self): print('init') def __enter__(self) ...
- python基础语法18 类的内置方法(魔法方法),单例模式
类的内置方法(魔法方法): 凡是在类内部定义,以__开头__结尾的方法,都是类的内置方法,也称之为魔法方法. 类的内置方法,会在某种条件满足下自动触发. 内置方法如下: __new__: 在__ini ...
- 面向对象相关概念与在python中的面向对象知识(魔法方法+反射+元类+鸭子类型)
面向对象知识 封装 封装的原理是,其成员变量代表对象的属性,方法代表这个对象的动作真正的封装是,经过深入的思考,做出良好的抽象(设计属性时用到),给出“完整且最小”的接口,并使得内部细节可以对外透明( ...
- python 面向对象进阶之内置方法
一 isinstance(obj,cls)和issubclass(sub,super) 1.1,isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(obj ...
- python进阶之类常用魔法方法和魔法属性
前言 前面我们总结过了python的关键字.运算符.内置函数.语法糖等与python魔法方法之间的关系,现在我们更细一点,看看python的面向对象编程有哪些常用的魔法属性和魔法方法. 魔法属性 对于 ...
- python:类3——魔法方法
一.魔法方法特点 被双上下滑线包围 魔法方法是面向对象的Python的一切,如果你不知道魔法方法,说明你还没能意识到面向对象的Python的强大(不是说Python脚本) 通过对制定方法的重写,完全可 ...
- python面向对象双下划线方法与元类
目录 双下划线方法(__) 元类简介 产生类的两种表现形式 元类的基本使用 元类进阶操作 __new__方法 双下划线方法(__) 面向对象中的双下方法也有一些人称之为是魔法方法,有些双下方法不需要刻 ...
- python 面向对象类成员(字段 方法 属性)
一.字段 字段包括:普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同, 普通字段属于对象 静态字段属于类 class Province: # 静态字段 countr ...
- 『无为则无心』Python面向对象 — 60、魔法属性
目录 1.魔法属性__name__ 2.魔法属性__bases__ 3.魔法属性__mro__ 4.魔法属性__doc__ 5.魔法属性__module__ 和__class__ 6.魔法属性__di ...
随机推荐
- 解决IIS中部署WCF时,访问.svc文件的404错误问题
如果你直接在IIS 7中配置WCF,访问.svc文件时会出现404错误.解决方法,以管理员身份进入命令行模式,运行:"%windir%\Microsoft.NET\Framework\v3. ...
- 把文件类型转化为byte[]
转自:https://blog.csdn.net/xinxiqi/article/details/78899159 package com.sanqing.util; import java.io.B ...
- excel的部分使用方法
第一行数据填充下面所有行的快捷键,ctrl+d 两个表关联替换:=VLOOKUP(H1576,Sheet3!$B$2:$C$315,2,0) 取消下拉框:数据>数据有效性>全部清除 快捷选 ...
- 任务34:Cookie-based认证实现
任务34:Cookie-based认证实现 用mvc来实现以下Cookie-Base的认证和授权的方式 新建一个web MVC的项目 在我的电脑的路径:D:\MyDemos\jesse Ctrl+鼠标 ...
- Struts2基本使用
Struts2:本质servlet 1.接受页面参数 a.使用原生的ServletAPI接受(不推荐) request.getParameter(name) 获取元素request方式: --Http ...
- ARC和MRC混合使用
在一些项目中尤其是做迭代的项目经常会出现MRC的项目,但是我们习惯了ARC环境,反之也是一样.这是我们不必去修改代码去掉release之类的,按照如下方案去做就可以了. 项目 -> Build ...
- 51nod 1092【区间dp】
思路: 简单的区间dp,从小区间到大区间,随便写. 还有一种是那啥,n-LCS...具体不说了,赶时间)))= =. #include <stdio.h> #include <str ...
- Contest Hunter 0103最短Hamilton路径 【状压dp】 By cellur925
题目传送门 Hamilton路径的定义:从0(起点)到n-1(终点)不重不漏地经过每个点恰好一次. 由于数据范围非常小,考虑状压.如NOIP2017宝藏一题,把状态压缩设为n个点是否已到达的二进制数. ...
- Redis生成主键ID
使用Redis來生成主鍵ID策略,這裡主要使用 RedisAtomicLong 類來實現主鍵生成策略.具體代碼如下: /** * @Description: 获取自增长值 * @param key k ...
- HBuilder mui 报错No 'Access-Control-Allow-Origin' header
Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' he ...