2011-11-12 90 views
1

在下面的代碼中,OP創建了一個繼承了Template類class BatchRename(Template):的類,並且在代碼的底部,他將該類實例化爲t = BatchRename(fmt),儘管沒有構造方法(def __init__():) 。正如我理解Python中的繼承一樣,這段代碼可能有些問題,但是我對Python很陌生,所以我可能會錯過一些東西。任何人都可以解釋我嗎?實例化一個沒有構造函數和繼承的Python類

小代碼解釋:該OP顯示瞭如何在模板中使用自定義分隔符,並且他正在對示例中的某些文件進行批量重命名。他正在創建一個繼承自Template的自定義類,以更改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 

我把這個代碼:http://docs.python.org/tutorial/stdlib2.html#templating

回答

3

你不需要在每一個Python類的__init__;它是可選的,只有在存在時才被調用。對於新型Python類的實際構造是__new__,這是從object繼承:

>>> 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 

如果一個類從一個類,它提供__init__繼承,該功能是繼承了一起,就像任何其他的方法。這與C++不同,其中構造函數被視爲特殊的並且不被繼承。

+0

您的意思是3.0版的說新風格? – Tarik

+1

@Braveyard:不,我的意思是Python 2.3(IIRC)以來實現的新類,即從'object'派生的類。 –

2

BatchRename這個類根本不需要有一個__init__,因爲它繼承了超類Template。例如:

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