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. python使用wmi模块获取windows下的系统信息监控系统-乾颐堂

    Python用WMI模块获取Windows系统的硬件信息:硬盘分区.使用情况,内存大小,CPU型号,当前运行的进程,自启动程序及位置,系统的版本等信息. 本文实例讲述了python使用wmi模块获取w ...

  2. sql转化为时间戳

    1.转化为时间戳 UNIX_TIMESTAMP():执行使用时间格式如:2009-08-06 10:10:40 .2009-08-06

  3. Jmeter参数化HTTP request中Send Files With The Request的文件路径和文件名

  4. Java数据结构和算法(七)B+ 树

    Java数据结构和算法(七)B+ 树 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 我们都知道二叉查找树的查找的时间复杂度是 ...

  5. oracle执行多个pl/sql块

    DECLARE    V_SQL_DROP_TABLE   VARCHAR2(50) := 'DROP TABLE MY_TEST2';    V_SQL_CREATE_TABLE VARCHAR2( ...

  6. 【Jsoup】Jsoup解析Html标签(Java后台解析)

    中文API网站(下载地址): http://www.open-open.com/jsoup/ 有时候编辑器传到后台的内容是带Html标签的,或者有时候需要形成一个完整的Html文档,也或者需要解析其中 ...

  7. 管理型交换机IEEE 802.1Q VLAN设置应用实例

    转载标注: IEEE802.1Q 我粗略理解为对交换机入口规则和出口规则设置,入口打上VID,设置从哪些口可以出去,并且是否带标签. 一 VLAN的概念 VLAN(Virtual Local Area ...

  8. 2018.09.24 bzoj1486: [HNOI2009]最小圈(01分数规划+spfa判负环)

    传送门 答案只保留了6位小数WA了两次233. 这就是一个简单的01分数规划. 直接二分答案,根据图中有没有负环存在进行调整. 注意二分边界. 另外dfs版spfa判负环真心快很多. 代码: #inc ...

  9. hdu-1142(记忆化搜索+dij)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1142 思路:1.不是求最短路径,而是求如果两个点A,B直接相连,且A到终点的距离大于B到终点的距离,求 ...

  10. web页面中a标签下载文件包含中文下载失败的解决

    之前用到的文件下载,文件名都是时间戳的形式或者英文名.下载没有问题.后来附件有中文后写在页面是下面效果,点击下载,下载失败. 对应链接拿出来.是如下效果 之前用了各种其他办法都不理想,比如转义什么的. ...