Pythonアクセサリを巧みに使用して親構造関数を呼び出す手間を省く

1309 ワード

まずコードを見てみましょう.
 
  
class T1(threading.Thread):
def __init__(self, a, b, c):
super(T1, self).__init__()
self.a = a
self.b = b
self.c = c

def run(self):
print self.a, self.b, self.c

コードはthreadingから継承する.Threadのclass、この文を見て
super(T1, self).__init__()
こう書くのが好きな人もいます
threading.Thread.__init__(self)
もちろん、役割は親クラスのコンストラクション関数を呼び出すことです.
こんなに長い間pythonコードを書いていて、書くたびに車輪を繰り返す感じがします.さっきふと装飾器といういいものを思い出して、pythonerが苦海から離れるのを助けてautoInitClassを書いてみました.手動で親構造関数を呼び出す手間を省きました.
コードは次のとおりです.
 
  
def autoInitClass(OldClass):
superClass = OldClass.mro()[1]
class NewClass(OldClass):
def __init__(*args):
self = args[0]
superClass.__init__(self)
apply(OldClass.__init__, args)
return NewClass

AutoInitClassアクセラレータを使用して新しいクラスを構築するには、次の手順に従います.
 
  
@autoInitClass
class T2(threading.Thread):
def __init__(self, a, b, c):
# super(T2, self).__init__()
self.a = a
self.b = b
self.c = c

def run(self):
print self.a, self.b, self.c

本文は:itianda's blogから来て、転載して原文の出所を明記してください