Python面向对象(特殊成员)
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面向对象(特殊成员)的更多相关文章
- Python面向对象之成员修饰符
对于这些类成员有修饰符 之前定义字段country任何对象都可以访问,是公有的 可以定义为私用属性,只有类内部的方法可以调用,外部不能直接调用,但是可以间接调用 vim day7-10.py #!/u ...
- python面向对象之类成员
面向对象编程: OOP编程是利用类和对象来创建各种模型来实现对真实世界的描述,使用面向对象编程的原因一方面是因为它可以使程序的维护和扩展变得简单,并可以大大提高程序开发效率.另外,基于面向对象的程序可 ...
- python面向对象之类成员修饰符
类的所有成员分为: 公有成员,在任何地方都能访问 私有成员,只有在类的内部才能访问 私有成员和公有成员的定义不同:私有成员命名时,前两个字符是下划线.(特殊成员除外,例如:__init__.__c ...
- Python面向对象-类成员
类的成员可以分为三大类:字段.方法和属性: 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段.而其他的成员,则都是保存在类中,即:无论对象的多少,在 ...
- python 面向对象(二)成员
##################################总结########################### 类的成员: 变量: 实例变量 对象.属性=xxx 类变量 ...
- python 面向对象类成员(字段 方法 属性)
一.字段 字段包括:普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同, 普通字段属于对象 静态字段属于类 class Province: # 静态字段 countr ...
- python面向对象的成员、属性等
#类成员: #字段 self.xy =qq . xy=qq #普通字段 (保存在对象里面) #直接通过点(.)+ 字段 进行调用 #静态字段 (保存在类里面) #静态字段属于类,在内存只保留一份 . ...
- python面向对象(二)——类成员
Python面向对象 类成员 1.字段 普通字段 属于对象 静态字段 属于类 2.方法 普通方法 触发者是对象 括号里至少一个参数 se ...
- python 面向对象和类成员和异常处理
python 面向对象 你把自己想象成一个上帝,你要创造一个星球,首先你要把它揉成一个个球,两个直径就能创造一个球 class star: '''名字(name),赤道直径(equatorial di ...
随机推荐
- Bad Hair Day
/* Some of Farmer John's N cows (1 ≤ N ≤ 80,000) are having a bad hair day! Since each cow is self-c ...
- 史上最全的Android开发学习教程集锦【初学者】
根据Google的报告,截止2017年5月为止,Android活跃用户已超过20亿,并还在持续增长中.Android系统在几个主要的市场上已超过了iOS系统,特别是在美国,欧洲和日本,然而苹果确实在中 ...
- asp.net web 通过IHttpAsyncHandler接口进行消息推送
.消息类,可直接通过这个类推送消息 HttpMessages using System; using System.Collections.Generic; using System.Linq; us ...
- msys2 git status显示中文文件名问题
git config [--global] core.quotepath off https://stackoverflow.com/questions/5854967/git-msysgit-acc ...
- cocos2d接安卓facebook插件(已测cocos-x 3.7 3.8版本)
1 控制台创建新工程: a 控制台 进入cocos2d文件夹下面,如cocos2d-x-3.7.1,执行setup.py,未设置NDK SDK ANT 路径的设置路径,需要改路径的 explore ...
- HTML <img> 标签的 alt 属性
定义和用法 alt 属性是一个必需的属性,它规定在图像无法显示时的替代文本. 假设由于下列原因用户无法查看图像,alt 属性可以为图像提供替代的信息: 网速太慢 src 属性中的错误 浏览器禁用图像 ...
- 构造函数constructor 与析构函数destructor(一)
构造函数定义:构造函数c++中在创建对象时自动调用,用来初始化对象的特殊函数. (1)构造函数的名字必须与类的名字相同,不能有返回值,哪怕是void 也不行. (2)通常情况下构造函数应声明为公有函数 ...
- 2018.10.22 bzoj4380: [POI2015]Myjnie(区间dp)
传送门 区间dp好题. f[i][j][k]f[i][j][k]f[i][j][k]表示区间[i,j][i,j][i,j]最小值为kkk时的最大贡献. 然后可以枚举端点转移. 当时口胡到这儿就不会了. ...
- hdu-1163(九余数定理)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1163 思路: 九余数定理:一个数对九取余的结果叫做九余数, 一个数的各个位数相加的得到的小于10的数也 ...
- C#与android连接 SimpleWifi
有时候 Read时会返回0长度 ----- 当连续2次每读到数据时,建议发个心跳信息,然后单片机给个回复 C# using System; using System.Collections.Gener ...