特殊方法:
__init__(self,*attr)方法: 重写__init__方法,也就是类的构造器,类在初始化的时候会首先调用__init__这个方法。 |
__str__(self)方法: 全局函数str(x)就是调用实例x内部的__str__()方法。 |
__repr__(self)方法: 全局函数repr(x)就是调用实例x内部的__repr()方法。 |
__len__(self)方法: 全局函数len(x)就是调用实例x内部的__len__()方法。 |
__getitem__(self,key)方法: 对于list取值的时候会调用这个方法,例如x=range(10),x[1]就是调用x.__getitem__(1),定义了这个方法的类就可以使用x[?]这种模式取值。
class
yhb_test:
def
__init__(self,x):
self.x=x
def
__getitem__(self,n):
return
1
;
if
__name__ ==
'__main__'
:
y=yhb_test(
10
)
print
y[
1
]
|
__setitem__(self,key,value)方法: 和__getitem__(self,key)相对,定义了这个方法的类就可以使用x[?]=...这种方式赋值。 |
__delitem__(self,key)方法: 对类内部属性使用del x[?]关键字的时候,实际调用的就是这个方法,如果没有重写这个方法,对自定义类内部使用del x[?]就会报错。 |
__getattribute__(self,name)方法: 如果某个类定义了 __getattribute__() 方法,在每次引用属性或者方法名称时候,Python 都调用它(特殊方法名称除外,因为那样将会导致讨厌的无限循环)。
#-*- coding:utf-8 -*-
__metaclass__=type
class
yhb_test:
def
__init__(self,x):
self.x=x
def
__getattribute__(self,n):
return
1
;
if
__name__ ==
'__main__'
:
y=yhb_test(
10
)
print
y.x
以上代码输出:1 |
__getattr__(self,name)方法: 与__getattribute__() 类似,但是__getatr__(self,name)之后在调用的属性在实例中未定义时才调用。 |
__setattr__(self,name,value)方法:
给实例中的属性赋值的时候调用这个方法,在定义类的时候,使用掉self.x(其中x是属性)这样的语法的时候也会调用__setatr__()方法。
例如:
#-*- coding:utf-8 -*-
__metaclass__=type
class
yhb_test:
def
__init__(self,x):
self.x=x
def
__setattr__(self,name,value):
print
'启动__setattr__'
if
__name__ ==
'__main__'
:
y=yhb_test(
10
)
y.x=
20
y.h=
30
输出:
启动__setattr__
启动__setattr__
启动__setattr__
|
__delattr__(self,name)方法: 调用del clazz.x这样的语法删除实例属性的时候就会调用以上方法。 |
__iter__(self)方法和next (self)(3.0以后用__next__(self)代替了next(self)): 如果要类可以在for...in...这样语法中迭代。那么类就要实现__iter__(self)和next(self)两个方法。 例如:
class
Fibs:
def
__init__(self):
self.a=
0
self.b=
1
def
next(self):
self.a,self.b=self.b,self.a+self.b
return
self.b
def
__iter__(self):
return
self
if
__name__ ==
'__main__'
:
fibs=Fibs()
for
f
in
fibs:
if
f>
1000
:
print
f
break
以上代码输出大于1000的最小的斐波那契数 |
特殊属性
类属性 __dict__ #打印出FirstDemo类的所有属性和方法,结果为一个字典 |
类属性 __bases__ #类的基类 |
类属性__doc__ #类的docstring |
类属性__name__ #类的名字 |
类属性 __module__ #类所在模块,如果是主文件,就是__main__ |
实例属性__class__ #类的类型<class '__main__.FirstDemo'> ,假设a是类FirstDemo的实例,使用a.__class__.__name__就能返回类名了。 |
实例属性__module__ #实例类型所在模块 |
实例属性__dict__ #对象的字典,存储所有实例成员信息 |
模块属性__ name__ :在主程序中__name__==main,在导入包中__name__为导入的包名 |
模块属性__all__:在使用from copy import *这样的语法的时候,如果在模块中定义了__all__属性,事实上是导入了__all__属性描述了的方法。其他方法不会被导入。如果没有__all__这个属性,以上语法就导入copy模块中的所有方法。 |
特殊文件
__init__.py文件:一个作为模块的包需要包含__init__.py,这个文件定义了再python中导入包的时候会导入__init__.py中声明的文件。 |