#类方法,属性和迭代器
#为了类是新型的,应该把语句__metaclass__=type放在模块的开始,
#或者子类化内建类object
class newtype(object):
pass
#构造方法:一个对象创建后,会立即调用构造方法,即__init__
class stu:
def __init__(self):
self.num=56
student=stu()
print(student.num)
class cls:
def __init__(self,name):
self.name=name
cl=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=10
self.height=10
rec=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 TypeError
if key<0:
raise IndexError
class AS:
def __init__(self,start=0,step=1):
self.start=start
self.step=step
self.change={}
def __getitem__(self,key):
checkindex(key)
try:
return self.change[key]
except KeyError:
return self.start+key*self.step
def __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=0
def __getitem__(self,index):
self.count+=1
return super(MyList,self).__getitem__(index)
#属性:通过访问器定义的特性被称为属性
#创建属性的一种机制:property函数
__metaclass__=type
class Rect:
def __init__(self):
self.width=0
self.height=0
def getSize(self):
return self.width,self.height
def setSize(self,size):
self.width,self.height=size
size=property(getSize,setSize)#创建了属性size
rect=Rect()
rect.width=20
rect.height=30
print(rect.getSize())
rect.size=(100,100)
print(rect.getSize())
运行结果: