物流公司做网站哪家好,沈阳城市建设学院,网站首页按钮图片,北京最大做网站的公司有哪些“包装”在Python 编程中经常会被提到的一个术语。意思是对一个已存在的对象进行包装#xff0c;可以是对一个已存在的对象#xff0c;增加#xff0c;删除#xff0c;或者修改功能。可以包装任何类型(type)作为一个类(class)的核心成员#xff0c;以使新对象的行为模仿你…“包装”在Python 编程中经常会被提到的一个术语。意思是对一个已存在的对象进行包装可以是对一个已存在的对象增加删除或者修改功能。可以包装任何类型(type)作为一个类(class)的核心成员以使新对象的行为模仿你想要的数据类型中已存在的行为并且去掉你不希望存在的行为。授权是包装的一个特性实现授权的关键点就是覆盖__getattr__()方法在其中包含一个对getattr()内建函数的调用。特殊方法__getattr__()的工作方式是当搜索一个属性时任何局部对象首先被找到(定制的对象)。如果搜索失败了则__getattr__()会被调用。换言之当引用一个属性时Python 解释器将试着在局部名称空间中查找那个名字如果没有在局部字典中找到则搜索类名称空间最后如果两类搜索都失败了搜索则对原对象开始授权请求此时__getattr__()会被调用。包装的一个简单例子classWrapMe(object):def __init__(self, obj):self.__data objdefget(self):return self.__datadef __repr__(self):return ‘self.__data‘def __str__(self):return str(self.__data)def __getattr__(self, attr):return getattr(self.__data, attr)这里将用到复数因为所有Python数值类型只有复数拥有属性 wrapcomplex WrapMe(3.54.2j)wrapcomplex(3.54.2j)wrapcomplex.real3.5wrapcomplex.imag4.2wrapcomplex.conjugate()(3.5-4.2j)wrapcomplex.get()(3.54.2j)访问复数的三种属性我们的自定义类中一种都没有定义对这些属性的访问是通过getattr()方法授权给对象。调用get()方法没有授权因为它是为我们的对象定义的。下一个使用包装类的例子用到一个列表。我们将会创建对象然后执行多种操作每次授权给列表方法。 wraplist WrapMe([123, foo, 45.67])wraplist.append(bar)wraplist.append(123)wraplist[123, foo, 45.67, bar,123]wraplist.index(45.67)2wraplist.count(123)2wraplist.pop()123wraplist[123, foo, 45.67, bar]注意只有已存在的属性是在此代码中授权的。特殊行为没有在类型的方法列表中不能被访问因为它们不是属性。一个例子是对列表的切片操作它是内建于类型中的而不是像append()方法那样作为属性存在的。也就是说切片操作符是序列类型的一部分并不是通过__getitem__()特殊方法来实现的。 wraplist[2]Traceback (most recent calllast):File, line 1, inTypeError:WrapMe objectdoes not support indexing然而还有一种作弊的方法访问实际对象通过get()方法和它的切片能力. reallist wraplist.get() reallist[3]bar这就是为什么需要实现get()方法了----仅仅是为了我们需要取得对原对象进行访问这种情况。另外一个例子描述了一个包装文件对象的类。我们的类与一般的文件对象行为完全一样, 除了在写模式中字符串只有全部为大写时才写入文件。下面提供一个文件类对象定制write()方法同时给文件对象授权其它的功能classCapOpen(object):def __init__(self, fn,moder, buf-1):self.fileopen(fn, mode, buf)def __str__(self):returnstr(self.file)def __repr__(self):returnself.filedefwrite(self, line):self.file.write(line.upper())def __getattr__(self, attr):returngetattr(self.file, attr) f CapOpen(/tmp/xxx,w)f.write(delegation example\n)f.write(faye is good\n)f.write(at delegating\n)f.close()f可以看到唯一不同的是第一次对CapOpen()的调用而不是open()。除了write()所有属性都已授权给文件对象: f CapOpen(/tmp/xxx, r) for eachLine inf:...printeachLine,...DELEGATION EXAMPLEFAYE IS GOODAT DELEGATING