通过子类扩展类型:
class MyList(list):
#----------------------------------------------------------------------
def __getitem__(self,offset):
""""""
print '(indexing %s at %s)' % (self,offset)
return list.__getitem__(self,offset-1)
if __name__=='__main__':
print list('abc')
x=MyList('avc')
print x
print x[1]
print x[3]
x.append('spam')
x.reverse()
执行结果:
['a', 'b', 'c']
['a', 'v', 'c']
(indexing ['a', 'v', 'c'] at 1)
a
(indexing ['a', 'v', 'c'] at 3)
c
类的伪私有属性:
class语句内开头有两个下划线但是结尾没有两个下划线的变量名,会自动扩张而包含了所在类的名称。例如像spam类内__X这样的变量名会自动变成_spam__X:原始的变量名会在头部加入一个下划线,然后是所在类名称。这样就不会和同一层次中其他类所创建的类似变量名相冲突
例子:
class C1:
def meth1(self):self.__X=88
#----------------------------------------------------------------------
def meth2(self):print self.__X
class C2:
def metha(self):self.__X=99
def methb(self):print self.__X
class C3(C1,C2):pass
I=C3()
I.meth1()
I.metha()
print I.__dict__
I.meth2()
I.methb()
执行输出结果:
{'_C2__X': 99, '_C1__X': 88}
88
99
内容属性:提供一种方式让类定义自动调用的方法,来读取或者赋值实例属性,用得最多的是__getattr__和__setattr__
class classic:
#----------------------------------------------------------------------
def __getattr__(self,name):
"""
__getattr__ intercept attribute invoker
"""
if name=='age':
return 40
else:
raise AttributeError
#----------------------------------------------------------------------
def __setattr__(self,name,value):
""""""
print 'set:',name,value
if name=='age':
self.__dict__['age']=value
else:
self.__dict__[name]=value
x=classic()
x.age
x.age=41
x.age