#类方法,属性和迭代器
#为了类是新型的,应该把语句__metaclass__=type放在模块的开始,
#或者子类化内建类object
class newtype(object):pass#构造方法:一个对象创建后,会立即调用构造方法,即__init__
class stu:def __init__(self):self.num=56student=stu()
print(student.num)class cls:def __init__(self,name):self.name=namecl=cls('TXY')
print(cl.name)#若一个类的构造方法被重写,那么就需要调用超类的构造方法,
#否则对象可能不会被正确的初始化#调用未绑定的超类构造方法:类名.__init__
class shape:def __init__(self):#在调用一个实例的方法时,self参数被自动绑定到实例:绑定方法self.area=100
class rect(shape):def __init__(self):shape.__init__(self)#实例不会绑定,参数可以自由提供self,:未绑定方法self.width=10self.height=10rec=rect()
print(rec.area)
print(rec.width)#使用super函数
class circle(shape):def __init__(self):super(circle,self).__init__()self.r=10
cir=circle()
print(cir.area)
print(cir.r)#成员访问:
'''
基本的序列和映射规则
__len__(self):返回集合中的项目数量
__getitem__(self,key):返回键对应的值
__setitem__(self,key,value):按一定的方式存储与key相关的value
__delitem__(self,key):对一部分对象使用del语句时被调用
'''#创建一个无穷序列
import math
def checkindex(key):if not isinstance(key,int):raise TypeErrorif key<0:raise IndexErrorclass AS:def __init__(self,start=0,step=1):self.start=startself.step=stepself.change={}def __getitem__(self,key):checkindex(key)try:return self.change[key]except KeyError:return self.start+key*self.stepdef __setitem__(self,key,value):checkindex(key)self.change[key]=value
s=AS(1,2)
print(s[4])#子类化列表,字典和字符串
'''
实现一个和内建列表行为相似的序列,list没有被重写的方法可以直接调用
'''
class MyList(list):def __init__(self,*args):super(MyList,self).__init__(*args)self.counter=0def __getitem__(self,index):self.count+=1return super(MyList,self).__getitem__(index)#属性:通过访问器定义的特性被称为属性
#创建属性的一种机制:property函数
__metaclass__=type
class Rect:def __init__(self):self.width=0self.height=0def getSize(self):return self.width,self.heightdef setSize(self,size):self.width,self.height=sizesize=property(getSize,setSize)#创建了属性sizerect=Rect()
rect.width=20
rect.height=30
print(rect.getSize())
rect.size=(100,100)
print(rect.getSize())
运行结果: