day25

__init__     类()自动执行
    __del__
    __call__     对象()  类()() 自动执行
    __int__      int(对象)  
    __str__      str()

特殊成员

 class Foo:
def __init__(self):
print('init') def __call__(self, *argc, **kwarge):
print('call') obj = Foo()#直接执行__init__ obj()#执行__call__中内容 Foo()()#同上

对象加括号,obj()执行__call__()。

执行结果:

init
call
init
call Process finished with exit code 0

__str__,__int__

 class Foo:
def __init__(self):
pass def __int__(self):
return 111 def __str__(self):
return "nizhipeng"
obj = Foo() print(obj, type(obj)) r = int(obj)#自动执行__int__方法,并将返回值给int对象
print(r) print(str(obj))

类型转换的时候,自动执行__int__,和__str__方法。

执行结果:

nizhipeng <class '__main__.Foo'>
111
nizhipeng Process finished with exit code 0

自动转换

 class Foo:
def __init__(self, n, a):
self.name = n
self.age = a
def __str__(self):
return '%s-%s' %(self.name, self.age) obj = Foo('alex', 18)
print(obj) #obj自动转成了str类型

第9行自动执行了str(obj)。

执行结果:

alex-18

Process finished with exit code 0

__add__

 class Foo:

     def __init__(self, name, age):
self.name = name
self.age = age def __add__(self, other):
#self为obj1包含信息(alex,18)
#other为obj2包含信息(eiro,66) '''return self.age + other.age'''
return Foo(obj1.name, other.age)#对象1的名字,对象2的年龄 def __del__(self):
print("析构方法")#对象销毁时执行 obj1 = Foo('alex', 19)
obj2 = Foo('eiro', 66) r = obj1 + obj2#两个对象相加时,自动执行第一个对象的__add__方法,并且将第二个对象当作参数 print(r.age, type(r))
两个对象相加时,自动执行第一个对象的__add__方法,并且将第二个对象当作参数
执行结果:
66 <class '__main__.Foo'>
析构方法
析构方法
析构方法 Process finished with exit code 0
__dict__
 class Foo:

     '''
注释也是类成员
'''
def __init__(self, name, age):
self.name = name
self.age = age
self.n = 123 obj = Foo('alex', 18) d = obj.__dict__#通过字典形式显示对象成员
print(d) ret = Foo.__dict__#通过字典形式显示类成员
print(ret)

__dict__()可以通过字典显示类成员,和对象成员。注释也是类成员的一部分。

执行结果:

{'name': 'alex', 'age': 18, 'n': 123}
{'__init__': <function Foo.__init__ at 0x7fb7f3155620>, '__doc__': '\n 注释也是类成员\n ', '__weakref__': <attribute '__weakref__' of 'Foo' objects>, '__dict__': <attribute '__dict__' of 'Foo' objects>, '__module__': '__main__'}
44 Process finished with exit code 0

__getitem__,__setitem__,__delitem__

 class Foo:
def __init__(self, name, age):
self.name = name
self.age = age def __getitem__(self, item):
return item+10 def __setitem__(self, key, value):
print(key, value) def __delitem__(self, key):
print(key)
li = Foo('alex', 18)
#以索引方式访问对象,执行__getitem__方法 r = li[8]#自动执行li对象类中的__getitem__方法, 8作为参数给item
print(r)#有获取数据属于需要返回值 li[100] = 'aasd'#执行__setitem__(), key为100,value为aasd del li[999]#执行__delitem__()

以索引方式访问需要以上几种特殊方法。

__setitem__,__delitem__并不获取数据,不需要return。

执行结果:

18
100 aasd
999 Process finished with exit code 0

__iter__

 class Foo:
def __init__(self, name, age):
self.name = name
self.age = age def __iter__(self):
return iter([11,22,33])#生成迭代器对象
#如果类中有__iter__方法,对象为可迭代对象
#对象.__iter__()的返回值:迭代器
li = Foo('alex', 18) for i in li:
print(i)
如果类中有__iter__方法,对象为可迭代对象,iter()生成迭代对象。

执行结果:


Process finished with exit code 

__new__ 和 __metaclass__

Foo类其实为type类的对象。

所有类默认继承object类。

http://www.cnblogs.com/wupeiqi/p/4766801.html

其中第11节

 class MyType(type):
#self 为 Foo
def __init__(self, *args, **kwargs):
print('')
pass def __call__(cls):
print('') #Foo为MyType对象
class Foo(object,metaclass=MyType):#任何类都继承object类,并使Foo类为type类子类MyType的对象
def __init__(self):
print('') def func(self):
print('hello') #使Foo类为type类子类MyType的对象,创建Foo对象时会执行类中的__init__()方法
#输出 123 #有__call__方法时输出456,对象加(),执行__call__方法,Foo是MyType的一个对象。
#没有时输出567,Foo类创建obj对象,执行__init__方法。
obj = Foo()
任何类都继承object类,并使Foo类为type类子类MyType的对象
执行结果:
123
456 Process finished with exit code 0

Python面向对象(特殊成员)的更多相关文章

  1. Python面向对象之成员修饰符

    对于这些类成员有修饰符 之前定义字段country任何对象都可以访问,是公有的 可以定义为私用属性,只有类内部的方法可以调用,外部不能直接调用,但是可以间接调用 vim day7-10.py #!/u ...

  2. python面向对象之类成员

    面向对象编程: OOP编程是利用类和对象来创建各种模型来实现对真实世界的描述,使用面向对象编程的原因一方面是因为它可以使程序的维护和扩展变得简单,并可以大大提高程序开发效率.另外,基于面向对象的程序可 ...

  3. python面向对象之类成员修饰符

      类的所有成员分为: 公有成员,在任何地方都能访问 私有成员,只有在类的内部才能访问 私有成员和公有成员的定义不同:私有成员命名时,前两个字符是下划线.(特殊成员除外,例如:__init__.__c ...

  4. Python面向对象-类成员

    类的成员可以分为三大类:字段.方法和属性: 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段.而其他的成员,则都是保存在类中,即:无论对象的多少,在 ...

  5. python 面向对象(二)成员

    ##################################总结########################### 类的成员: 变量: 实例变量      对象.属性=xxx 类变量    ...

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

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

  7. python面向对象的成员、属性等

    #类成员: #字段 self.xy =qq . xy=qq #普通字段 (保存在对象里面) #直接通过点(.)+ 字段 进行调用 #静态字段 (保存在类里面) #静态字段属于类,在内存只保留一份 . ...

  8. python面向对象(二)——类成员

    Python面向对象    类成员 1.字段         普通字段    属于对象         静态字段    属于类   2.方法 普通方法   触发者是对象    括号里至少一个参数 se ...

  9. python 面向对象和类成员和异常处理

    python 面向对象 你把自己想象成一个上帝,你要创造一个星球,首先你要把它揉成一个个球,两个直径就能创造一个球 class star: '''名字(name),赤道直径(equatorial di ...

随机推荐

  1. [freeCodeCamp] solution to HTTP JSON API SERVER passed!

    var http = require('http') var url = require('url') function parsetime (time) { return { hour: time. ...

  2. git保护进程

    https://github.com/Mattiwatti/PPLKiller 去掉进程保护内核级

  3. jQuery 操作 html5 data-* 属性

    Html 部分: <a class="nav-item" href="javascript: void(0)" data-id="{{$item ...

  4. app怎么测试性能

    性能测试一般来说 都是代码能力相对薄弱的测试人员 进阶的一个方向:但是当你成为一个真正的全栈人才的时候你就不得不学习代码: APP 或者安卓手机 或者iOS  一本测试他的性能的话都是采用:手机安装一 ...

  5. crontab误删除

    命令如下: cat /var/log/cron* | grep -i "`which cron`" > ./all_temp cat ./all_temp | grep -v ...

  6. 2018.09.19 atcoder AtCoDeer and Rock-Paper(贪心)

    传送门 sb贪心啊. 显然能选帕子就选帕子. 首先假设第一个人全出石头. 考虑把一些石头修改成帕子. 这样贡献只增不减,加起来就是答案. 代码: #include<bits/stdc++.h&g ...

  7. T4系列文章之2:T4工具简介、调试以及T4运行原理(转)

    出处:http://www.cnblogs.com/damonlan/archive/2012/01/12/2320429.html 一.前言 经过第一篇,我想大家现在对T4有了基本的印象,应该对T4 ...

  8. opp小节

    本章总结 练习题 面向对象三大特性,各有什么用处,说说你的理解. 类的属性和对象的属性有什么区别? 面向过程编程与面向对象编程的区别与应用场景? 类和对象在内存中是如何保存的. 什么是绑定到对象的方法 ...

  9. trcd_extract_EDCD_new

    # -*- coding:utf-8 -*- import re ''' 适应新版本 ''' year='17A'#用户自定义 ss='./data/'#根目录 filename = ss+'EDCD ...

  10. ansible facts 获取硬件信息

    facts 指的是 ansible_facts 变量,ansible 中使用 setup 模块来获取,包含系统的大部分基础硬件信息, [root@10_1_162_39 host_vars]# ll ...