1. 类添加新属性和新属性赋值:
__metaclass__ = type
class Rectangle:
def __init__(self):
self.width = 0
self.height = 0
def __setattr__(self, name, value):
if name == 'size': # size property = value
self.width, self.height = value
else: #insert new property by dict
self.__dict__[name] = value
def __getattr__(self, name):
if name == 'size':
return self.width, self.height
else:
raise AttributeError
re = Rectangle()
re.size = (10,20)
re.pro = {"name":"Benson", "age":21}
print re.size
print re.pro
__metaclass__ = type
class Rec:
def __init__(self):
self.width = 0
self.height = 0
def setSize(self, size):
self.width, self.height = size
def getSize(self):
return self.width, self.height
size = property(getSize, setSize)
rc = Rec()
rc.size = (2,3)
print rc.size
2.序列和映射:
__metaclass__ = type
def checkIndex(key):
if not isinstance(key, (int, long) ): raise TypeError
if key < 0: raise IndexError
class ArithmeticSequence:
def __init__(self, start = 0, step = 1):
self.start = start
self.step = step
self.changed = {}
def __getitem__(self, key):
checkIndex(key)
try: return self.changed[key]
except KeyError:
return self.start+key*self.step
def __setitem__(self, key, value):
checkIndex(key)
self.changed[key] = value
s = ArithmeticSequence(1, 2)
print s[4]
3. __setattr__, __getattr__, __delattr__, __call__定义与用法:
__metaclass__ = type #新类语法
class MyDict(dict): #继承dict类
#当试图给特性key赋值时被调用
def __setattr__(self, key, value):
self[key] = value
#当特性key被访问且对象没有响应的特性时被调用
def __getattr__(self, key):
try:
return self[key]
except KeyError, k:
return None
#当试图删除特性key时被自动调用
def __delattr__(self, key):
try:
del self[key]
except KeyError, k:
return None
#当试图调用特性key时被调用
def __call__(self, key):
try:
return self[key]
except KeyError, k:
return None
test = MyDict()
test.name = "Benson" #调用__setattr__
print test('name') #__call__
print test['name'] #dict默认行为
print test.name #__getattr__
del test.name #__delattr__