2011-11-12 11 views
1

次のコードでOPはTemplateクラスclass BatchRename(Template):を継承したクラスを作成し、コードの最後には工法がないのに(def __init__():)、クラスをt = BatchRename(fmt)としてインスタンス化しています。 。私がPythonで継承を理解しているので、このコードに何か問題があるかもしれませんが、私はPythonには新しいので、何か不足しているかもしれません。誰も私にこれを説明できますか?コンストラクション関数と継承を持たないPythonクラスのインスタンス化

リトルコード説明:OPは、テンプレートでカスタム区切り文字を使用する方法を示していて、彼は例のいくつかのファイルに名前を変更するバッチを行っています。彼はテンプレートから継承するカスタムクラスを作成して、delimeterという名前(フィールド、プロパティ、属性)を変更し、内部の機能を同時に使用します。

>>> import time, os.path 
>>> photofiles = ['img_1074.jpg', 'img_1076.jpg', 'img_1077.jpg'] 
>>> class BatchRename(Template): 
...  delimiter = '%' 
>>> fmt = raw_input('Enter rename style (%d-date %n-seqnum %f-format): ') 
Enter rename style (%d-date %n-seqnum %f-format): Ashley_%n%f 

>>> t = BatchRename(fmt) 
>>> date = time.strftime('%d%b%y') 
>>> for i, filename in enumerate(photofiles): 
...  base, ext = os.path.splitext(filename) 
...  newname = t.substitute(d=date, n=i, f=ext) 
...  print '{0} --> {1}'.format(filename, newname) 

img_1074.jpg --> Ashley_0.jpg 
img_1076.jpg --> Ashley_1.jpg 
img_1077.jpg --> Ashley_2.jpg 

私がこのコードを取った:あなたはすべてのPythonクラスで__init__を必要としないhttp://docs.python.org/tutorial/stdlib2.html#templating

答えて

3

。これはオプションで、存在する場合にのみ呼び出されます。新しいスタイルのPythonのクラスの実際のコンストラクタはobjectから継承され__new__、されています。クラスは__init__が提供されていたクラスから継承する場合、その関数は、他の方法と同様に、一緒に継承されている

>>> class Foo(object): 
... pass 
... 
>>> Foo() 
<__main__.Foo object at 0x021757F0> 
>>> Foo(1) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: object.__new__() takes no parameters 

。これは、コンストラクタが特別なものとして扱われ、継承されないC++とは異なります。

+0

new-styleと言うことでバージョン3.0を意味しますか? – Tarik

+1

@Braveyard:いいえ、Python 2.3(IIRC)以降に実装された新しいスタイルのクラス、つまり 'object'から派生したクラスです。 –

2

クラスBatchRenameは、スーパークラスTemplateから継承されているため、__init__はまったく必要ありません。例:

class A: 
    def __init__(self): 
     self.age = 27 

class B(A): 
    pass # Does nothing 

>>> A().age 
27 
>>> B().age # Calling __init__ from super class A 
27