2013-03-27 59 views
2

我想知道是否有人知道在使用@property和常規屬性時是否有任何細微差別?python中的屬性裝飾器初始化

在python中使用@property裝飾器時,對於屬性的初始化可能會出現任何問題嗎? 我的理解是,這個裝飾器允許一個屬性在每次被調用的時候被函數計算出來,因爲它是一個依賴於其他可變屬性的屬性。 我已經寫了一些這些@property修飾器,但他們不工作的原因。 我收到這種形式的錯誤:

for key in temp_spectra.overall_properties_dictionary:

AttributeError: 'Spectra' object has no attribute 'overall_properties_dictionary'

據我瞭解,創建這些@property S上的正確的方法是,像這樣:

from PyQt4 import QtCore, QtGui 
class someObject(QtCore.QObject): 
    def __init__(self, x, y): 
     self.x = x 
     self.y = y 

    @property 
    def some_other_property(self): 
     # some complicated function which will recalculate everytime it is called 
     # because the other properties may be mutable 
     p = self.x + self.y 
     return p 
class otherObject(QtGui.QTabWidget): 
    def __init__(self, someObject): 
     print someObject.some_other_property 

otherObject(someObject(1,5)) 

然而,這作品!所以我不確定我的代碼的哪一部分可能會導致這種情況。
值得一提的是,我正在將我的代碼轉換爲使用multiprocessing。這會導致問題嗎?我只是不明白什麼可能會出現錯誤的初始化導致這種類型的錯誤。

編輯:我改變了代碼的建議,以符合新風格的類*

+0

'@ property'性能不規律。 – glglgl 2013-03-27 16:10:16

回答

4

有一件事值得一提的是,性能只支持新型類,你是不是。

變化

class someObject: 

class someObject(object): 
+0

哦,我不知道有新舊風格的課程。然而,我的主要計劃確實存在不足。拋出錯誤的對象沒有該屬性,而是一個'QtCore.QObject'對象,而聚合並調用該對象的對象是'QtGui.QTabWidget'對象。 – chase 2013-03-27 16:07:45

+0

我更改了代碼,但它仍然適用於該示例,但仍然無法在我的主程序中使用。新式/舊式的類別差異是否真的會導致屬性出現問題? – chase 2013-03-27 16:11:37

+1

@chase:可以。至於你的主要問題,我不確定。 – NPE 2013-03-27 16:13:21