オライリーのPythonクックブック第二版の中で以下のようなPython2.3や2.4で書かれた古いコードがあります。
Python2
1class Proxy(object): 2 """ すべてのプロキシクラスのベースクラス """ 3 def __init__(self, obj): 4 super(Proxy, self).__init__() 5 self._obj = obj 6 def __getattr__(self, attrib): 7 return getattr(self._obj, attrib) 8def make_binder(unbound_method): 9 def f(self, *a, **k): 10 return unbound_method(self._obj, *a, **k) 11 # Python2.4以降ではこうする 12 f.__name__ = unbound_method.__name__ 13 return f 14known_proxy_classes = {} 15def proxy(obj, *specials): 16 """ 特殊メソッドを移譲できるプロキシを作るファクトリ関数 """ 17 # 適当なカスタムクラスがあるのでは? 18 obj_cls = obj.__class__ 19 key = obj_cls, specials 20 cls = known_proxy_classes.get(key) 21 if cls is None: 22 # 既存のプロキシクラスがないので自動生成する 23 cls = type("%sProxy" % obj_cls.__name__, (Proxy,), {}) 24 for name in specials: 25 name = '__%s__' % name 26 unbound_method = getattr(obj_cls, name) 27 setattr(cls, name, make_binder(unbound_method)) 28 # 次に呼び出された時のためにキャッシュする 29 known_proxy_classes[key] = cls 30 # 必要なプロキシをインスタンス化して返す 31 return cls(obj) 32
Python2
1def empty_copy(obj): 2 class Empty(obj.__class__): 3 def __init__(self): pass 4 newcopy = Empty() 5 newcopy.__class__ = obj.__class__ 6 return newcopy 7 8class YourClass(object): 9 def __init__(self): 10 ## assume there's a lot of work here 11 def __copy__(self): 12 newcopy = empty_copy(self) 13 ## copy some relevant subset of self's attributes to newcopy 14 return newcopy 15 16if __name__ == '__main__': 17 import copy 18 y = YourClass() # This, of course, does run __init__ 19 print(y) 20 z = copy.copy(y) # ...but this doesn't 21 print(z) 22
これらの中で、
Python2
1# Python2.4以降ではこうする 2f.__name__ = unbound_method.__name__
や
Python2
1newcopy.__class__ = obj.__class__
この部分が何のためにこのような処理を書き加えているのか教えて頂けないでしょうか?
また、現在のPython3でも上記コードは動きますが、Python3.x現在でも上記のようなコードを書き加えるものなのでしょうか?
回答2件
あなたの回答
tips
プレビュー