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. linux-centos6-rabbitmq安装及配置

    服务器版本centos6.8 一.先安装Erlang 具体安装哪个版本可以对照 http://www.rabbitmq.com/which-erlang.html 如下图: 准备安装RabbitMQ3 ...

  2. Error writing temporary file. Make sure your temp folder is valid

    NSIS Error:Error writing temporary file. Make sure your temp folder is valid的解决     老婆用了自己的WIN7系统一段时 ...

  3. svn一次性add/delete所有文件

    Linux命令行下,svn add 一次性批量上传 命令行下操作svn没有使用界面形式的TortoiseSVN直观,但是不管怎样,命令行下操作svn还是有它的有点,如果你碰到一次需要svn add许多 ...

  4. PID算法(C语言)

    /************ PID算法(C语言) ************/ #include <stdio.h> #include<math.h> struct _pid { ...

  5. Banner中文字怎么排版才好看?

    今天这命题,相信有很多人提出过疑问,一个好的文字排版会给你的作品增添色彩,我们先看看好的作品是怎样的. 看完这些图大家都能感觉出来这是一个好的作品,大家天生就对美和丑有一定的区分. 其实文字排版也好, ...

  6. To set Nginx Upload Size For “413–Request Entity Too Large” Error

    Modify NGINX Configuration File sudo nano /etc/nginx/nginx.conf Search for this variable: client_max ...

  7. Java数据结构和算法(二)顺序存储的树结构

    Java数据结构和算法(二)顺序存储的树结构 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 二叉树也可以用数组存储,可以和完 ...

  8. 并发编程(二)concurrent 工具类

    并发编程(二)concurrent 工具类 一.CountDownLatch 经常用于监听某些初始化操作,等初始化执行完毕后,通知主线程继续工作. import java.util.concurren ...

  9. 2018.09.27 codeforces1045A. Last chance(线段树优化建图+最大流)

    传送门 看完题应该都知道是网络流了吧. 但是第二种武器直接建图会gg. 因此我们用线段树优化建图. 具体操作就是,对于这m个人先建一棵线段树,父亲向儿子连容量为inf的边,最后叶子结点向对应的人连容量 ...

  10. 2018.07.08 NOIP模拟 第K小数(二分)

    第K小数 题目背景 SOURCE:NOIP2016-AHSDFZ T1 题目描述 有两个正整数数列,元素个数分别为 N 和 M .从两个数列中分别任取一个数相乘,这样一共可以得到 N*M 个数,询问这 ...