day6-面向对象补充篇--类的特殊成员
先说明一下,今天的内容主要转自师兄张其高的博客http://www.cnblogs.com/zhangqigao/articles/6935221.html
前面我们讲了类的方法,有普通方法,就是我们自己定义的方法,还有静态方法,类方法,属性方法,其实类还有另外一种方法,叫做类的特殊成员方法。这里就把主要的类的特殊成员方法大概讲解一下。
- __doc_
表示类的描述信息


1 class Dog(object):
2 """此类是形容Dog这个类""" #类的描述信息
3
4 def __init__(self,name):
5 self.name = name
6
7
8 print(Dog.__doc__) #打印类的描述信息
9
10 #输出
11 此类是形容Dog这个类
- __module__和__class__
说明:
- __module__: 表示当前操作的对象在哪个模块
- __class__:表示当前操作的对象的类是什么
aa.py的代码:


1 class C(object):
2
3 def __init__(self):
4 self.name = "Alex"
index.py的代码:


1 from lib.aa import C
2
3 obj = C()
4
5 print(obj.__module__) #表示当前操作的对象在哪个模块
6 print(obj.__class__) #表示当前操作的对象的类是什么
7
8 #输出
9 lib.aa
10 <class 'lib.aa.C'>
- __init__
说明:构造方法,通过类创建对象时,自动触发执行,这里不再赘述举例了。
- __del__
说明:析构方法,当对象在内存中被释放时,自动触发执行
(1) 注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,
(2) 所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的
- __call__
说明: 对象后面加括号,触发执行


1 class Foo(object):
2 def __init__(self):
3 self.name = "Alex"
4
5 def __call__(self, *args, **kwargs): #重写call方法
6 print("running call",args,kwargs)
7
8 f = Foo() #执行__init__
9 f(1,2,3,name=333) # 执行call方法,也可以写成 Foo()(1,2,3,name=333)
10
11 #输出
12 running call (1, 2, 3) {'name': 333}
注:构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()
- __dict__
说明: 查看类或对象中的所有成员
①类.__dict__
效果:打印类中所有的属性,不包括实例属性


1 class Province(object):
2
3 country = 'China'
4
5 def __init__(self, name, count):
6 self.name = name
7 self.count = count
8
9 def func(self, *args, **kwargs):
10 print("func")
11
12 print(Province.__dict__) #类.__dict__
13
14 #输出
15 {'__doc__': None, '__weakref__': <attribute '__weakref__' of 'Province' objects>, '__init__':
16 <function Province.__init__ at 0x00000247F3CAD488>, 'country': 'China', '__dict__':
17 <attribute '__dict__' of 'Province' objects>, 'func': <function Province.func at
18 0x00000247F3CAD510>, '__module__': '__main__'} #打印类中所有的属性,不包括实例属性
②实例名.__dict__
效果:打印该实例的所有属性,不包括类属性


1 class Province(object):
2
3 country = 'China'
4
5 def __init__(self, name, count):
6 self.name = name
7 self.count = count
8
9 def func(self, *args, **kwargs):
10 print("func")
11
12 p = Province("jiangsu",20000) #实例化
13 print(p.__dict__) #实例名.__dict__
14
15 #输出
16 {'count': 20000, 'name': 'jiangsu'} #打印该实例的所有属性,不包括类属性
- __str__
说明:如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值


1 class Province(object):
2
3 country = 'China'
4
5 def __init__(self, name):
6 self.name = name
7
8 def __str__(self):
9 return "<obj:{0}>".format(self.name)
10
11 p = Province("jiangsu")
12 print(p) #打印这个对象
13
14 #输出
15 <obj:jiangsu> #给对象重新起了一个名字
注:这个以后会在django框架里面会用到,这边就不多说了
- __getitem__、__setitem__、__delitem__
说明:用于索引操作,如字典。以上分别表示获取、设置、删除数据


1 class Foo(object):
2
3 def __getitem__(self, key):
4 print('__getitem__:',key)
5
6 def __setitem__(self, key, value):
7 print('__setitem__:',key,value)
8
9 def __delitem__(self, key):
10 print('__delitem__',key)
11
12
13 f = Foo()
14 f["name"] = "shuaigaogao" #自动触发__setitem__方法
15 f["name"] #自动触发__getitem__方法
16 del f["name"] #自动触发__delitem__方法
17
18 #输出
19 __setitem__: name shuaigaogao
20 __getitem__: name
21 __delitem__ name
注:这边的__delitem__没有做真正的删除,只是触发这个方法,想要真正删除,只需要在__delitem__函数中添加删除功能即可
以下内容转自老师的博客http://www.cnblogs.com/wupeiqi/p/4766801.html
- __getslice__、__setslice__、__delslice__
这三个方法用于分片操作,如:列表


1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3
4 class Foo(object):
5
6 def __getslice__(self, i, j):
7 print '__getslice__',i,j
8
9 def __setslice__(self, i, j, sequence):
10 print '__setslice__',i,j
11
12 def __delslice__(self, i, j):
13 print '__delslice__',i,j
14
15 obj = Foo()
16
17 obj[-1:1] # 自动触发执行 __getslice__
18 obj[0:1] = [11,22,33,44] # 自动触发执行 __setslice__
19 del obj[0:2] # 自动触发执行 __delslice__
- __iter__
用于迭代器,之所以列表、字典、元组可以进行for循环,是因为类型内部定义了 __iter__
第一步:


1 class Foo(object):
2 pass
3
4
5 obj = Foo()
6
7 for i in obj:
8 print i
9
10 # 报错:TypeError: 'Foo' object is not iterable
第二步:


1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3
4 class Foo(object):
5
6 def __iter__(self):
7 pass
8
9 obj = Foo()
10
11 for i in obj:
12 print i
13
14 # 报错:TypeError: iter() returned non-iterator of type 'NoneType'
第三步:


1 # !/usr/bin/env python
2 # -*- coding:utf-8 -*-
3
4 class Foo(object):
5
6 def __init__(self, sq):
7 self.sq = sq
8
9 def __iter__(self):
10 return iter(self.sq)
11
12 obj = Foo([11,22,33,44])
13
14 for i in obj:
15 print(i)
16
17 输出:
18 11
19 22
20 33
21 44
以上步骤可以看出,for循环迭代的其实是 iter([11,22,33,44]) ,所以执行流程可以变更为:


1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3
4 obj = iter([11,22,33,44])
5
6 for i in obj:
7 print(i)


1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3
4 obj = iter([11,22,33,44])
5
6 while True:
7 val = obj.next()
8 print val
day6-面向对象补充篇--类的特殊成员的更多相关文章
- python基础-9.1 面向对象进阶 super 类对象成员 类属性 私有属性 查找源码类对象步骤 类特殊成员 isinstance issubclass 异常处理
上一篇文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中) 对象 ...
- 前端学PHP之面向对象系列第一篇——类和对象
× 目录 [1]类 [2]成员属性[3]成员方法[4]对象[5]成员访问[6]this 前面的话 面向对象程序设计(OOP)是一种计算机编程架构.计算机程序由单个能够起到子程序作用的单元或对象组成,为 ...
- Java面向对象进阶篇(包装类,不可变类)
一. Java 8的包装类 Java中的8种基本数据类型不支持面向对象的变成机制,也不具备对象的特性:没有成员变量,方法可以调用.为此,Java为这8 种基本数据类型分别提供了对应的 包装类(Byte ...
- JavaSE| 面向对象-类的五大成员
面向对象 面向对象只是其中一种编程思想,还有很多其他的编程思想:面向过程.面向切面.面向服务编程... 面向过程的思维方式:注重步骤.过程,面向过程强调的是功能行为: 面向对象的思维方式:关注的是“对 ...
- python中的面向对象学习以及类的封装(这篇文章初学者一定要好好看)
这篇文章对于初学者可以很有效的理解面对过程.面对对象 一.首先介绍一下面向过程和面向对象的比较: 面向过程 VS 面向对象 编程范式 编程是程序员用特定的语法+数据结构+算法组成的代码来告诉计算机如何 ...
- python 面向对象(类的特殊成员)
python 面向对象: (思维导图 ↑↑↑↑) 类的特殊成员 python的类成员存在着一些具有特殊含义的成员 1.__init__: 类名() 自动执行 __init__ class Foo(ob ...
- Python面向对象2:类与对象的成员分析及self
# 3. 类和对象的成员分析- 类和对象都可以存储成员,成员可以归类所有,也可以归对象所有- 类存储成员时使用的是与类关联的一个对象- 独享存储成员是是存储在当前对象中- 对象访问一个成员时,如果对象 ...
- Python学习:17.Python面向对象(四、属性(特性),成员修饰符,类的特殊成员)
一.属性(特性) 普通方法去执行的时候,后面需要加括号,特性方法执行的时候和静态字段一样不需要不需要加括号. 特性方法不和字段同名. 特性方法不能传参数. 在我们定义数据库字段类的时候,往往需要对其中 ...
- luogg_java学习_05_面向对象(方法和类)
这篇总结断断续续写了2天,内容来自Oracle java8编程入门官方教程和课外搜索总结,希望自己以后返回来看的时候都懂,也希望可以起到帮助初学者的作用. 转载请注明 出自 luogg的博客园 , 因 ...
随机推荐
- 给idea配置默认的maven
一.配置Maven环境 1.下载apache-maven文件,选择自己需要的版本,地址: http://mirror.bit.edu.cn/apache/maven/maven-3/3.5.0/bin ...
- Mac下Jmeter快速安装与入门-模拟测试Post请求及设置Http头
[1]去Apache官网下载 Binaries系列的最新Jmeter.gz包 [2]下载到本地之后解压缩,进入到解压之后的目录然后,找到apache-jmeter-4.0/bin/jmeter.sh ...
- apache服务器设置
服务器目录 目录说明 bin: apache常用的一些命令 cgi-bin:存放一些脚本语言命令 conf:apache配置文件 error:错误记录 htodcs存放站点文件 logs:记录日志 m ...
- linux中uptime命令获取主机运行时间和查询系统负载信息
系统中的uptime命令主要用于获取主机运行时间和查询linux系统负载等信息.uptime命令可以显示系统已经运行了多长时间,信息显示依次为:现在时间.系统已经运行了多长时间.目前有多少登陆用户.系 ...
- linux性能分析命令1:top命令
转载:http://www.cnblogs.com/peida/archive/2012/12/24/2831353.html top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的 ...
- C++中string的成员函数
string类的构造函数: string(const char *s); //用c字符串s初始化 string(int n,char c); //用n个字符c初始化 此外,string类还支持默认构造 ...
- 【vim】几种模式的切换
很多初学者启动vim后,不知道怎么输入字符:按了半天字母,结果屏幕还是空的. vim和记事本或WORD不一样,不是一打开后就可以输入文字,此时它处于正常模式. vim一共有4个模式: 正常模式 (No ...
- hdu 2896:病毒侵袭
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission ...
- ASP.NET Web API Claims Authorization with ASP.NET Identity 2.1 Part 5 (by TAISEER)
https://www.cnblogs.com/KimmyLee/p/6430474.html https://www.cnblogs.com/rocketRobin/p/9077523.html h ...
- JDK 中的监控与故障处理工具-03 (jstat)
jstat : JVM statistics monitoring tool jstat 命令可以监控 JVM 虚拟机各种运行时状态信息, 包括 内存状态 ,垃圾回收 ,类的装载等信息. jstat ...