2010-11-19 54 views

回答

3

你可以用子類實現同樣的事情,事實上你甚至不需要子類 - 你也可以簡單地通過在另一個方法中包裝一個方法並重新分配它來達到同樣的目的。有很多關於裝飾器語法是否應該添加到語言中的討論,因爲它不允許你做任何新的事情,並且要求程序員學習一件新事物。

什麼語法dooes正式化了一個很多人已經使用的模式,並且使它成爲一個標準的語法,它有一個名字和如何使用的指導。您無需使用裝飾器 - 您可以通過其他方式實現相同的效果 - 但使用官方支持的標準方法和簡潔易讀的語法使生活變得更加簡單。

+0

我當然希望OP知道'@spam \ nclass Ham {...} =='class Ham {...};火腿=垃圾郵件(火腿)',只是問爲什麼使用這種模式,而不是使用子類。 – delnan 2010-11-19 21:03:18

1
  1. 你知道,前面加上@spam class|def name的定義僅僅意味着「這裏寫的定義名稱,然後綁定namespam(name)」?

  2. 裝飾者經常應用於功能而不是類。當然,你可以創建一個可調用的類和子類......你也可以實現你自己的整數類型。兩者都不可行。

  3. 在相當多的情況下,你propably 可以做到通過繼承......一些非常相似,除了裝飾被定義一次,並且可以適用於幾類,而不是自己在任何情況下寫一個新的子類。每個解決方案都不可避免地會與裝飾者相當或非常相似。

羅伯特指出了一個評論,如果你有一個例子,答案可能是更具體的...