python类中的特殊属性and特殊方法and特殊文件

时间:2022-11-02 16:13:39

特殊方法:

__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模块中的所有方法。
python类中的特殊属性and特殊方法and特殊文件

特殊文件
__init__.py文件:一个作为模块的包需要包含__init__.py,这个文件定义了再python中导入包的时候会导入__init__.py中声明的文件。