1、class绑定属性与方法
#coding=utf-8
# 类
class Student(object):
pass
# 定义一个实例
student = Student()
# 绑定属性
student.name = 'name'
# 定义一个方法
def grade():
pass
# 实例绑定方法,其他实例不能用该方法
from types import MethodType
student.grade = MethodType(grade,student,Student)
# 类绑定方法,所有实例都可以调用
Student.grade = MethodType(grade,None,Student)
# 为了限制实例绑定属性
class User(object):
# 指定name可以被绑定,父类有指定也可以绑定
__slots__ = ('name')
user = User()
user.name = 'name' # 可以绑定
user.sex = 'men' # 错误,不能够绑定
2、使用装饰器
#coding=utf-8
class Student(object):
# 属性是私有的
# 类似getName,但调用时,直接.name
@property
def name(self):
return self.__name
# 类似serName,但调用时,直接.name = xxx
@name.setter
def name(self,name):
self.__name = name
#测试
if __name__ == '__main__':
student = Student()
student.name = 'name'
print student.name # name
3、定制类
A:__str__
class Student(object):
def init(self,name):
self.name = name
def __str__(self):
print 'tihs is Student,name = %s',self.name
student = Student('Array')
print student # this is Student,name = Array
print Student('Array') # this is Student,name = Array
B:__iter__,next() 用作类的迭代
class Number(object):
def __init__(self,n=0):
self.n = n
def __iter__(self):
return self
def next(self):
self.n = self.n + 1
if self.n >= 10:
raise StopIteration
return self.n
# 测试
number = Number()
for n in number:
print n
# 结果 1 2 3 4 5 6 7 8 9
C:__getitem__ 可以通过下标显示
class Number(object):
def __init__(self,n=0):
self.n = n
def __getitem__(self,n):
a,b = 1,1
# 下标获取
if isinstance(n,int):
for m in range(n):
a,b = b,a+b
return a
# 切片
if isinstance(n,slice):
l = []
start = n.start
stop = n.stop
for m in range(stop):
a,b = b,a+b
if start <= m:
l.append(a)
return l
# 测试
number = Number()
# 下标
print number[2] # 2
# 切片 [1,2,3,5,8,13,21,34,55,89]
print number[0:10]
D:__getattr__避免调用不存在属性产生的异常
class User(object):
def __getattr__(self,attr):
# 属性名是name 返回Array
if 'name' == attr:
return 'Array'
# 其他属性,返回提示信息
return 'no attr: %s' % attr
# 测试
user = User()
print user.name # Array
print user.sex # no attr:sex
4、动态创建类
A:type()
# 使用type可以查看变量的类型,也可以动态创建类
print (type(Student)) # <tpye 'type'> 类的类型就是type
s = Student()
print s # <type 'Student'>
# 动态创建类
# 定义一个函数
#coding=utf-8
def m1(self):
print 'm1'
def m2(self):
print 'm2'
# 创建类,并绑定函数
# 参数1:类名
# 参数2:继承的类,当只有一个时,用tuple写法
# 参数3:类的方法名绑定函数名
Test = type('Test',(object,),dict(f1 = m1,f2 = m2))
# 测试
t = Test()
t.f1() # m1
t.f2() # m2
B:metaclass() 待定