2014-03-06 60 views
0

我有 django模型類(PS:模型類是一個代表django結構的數據庫表的類,它們全部來源於 Model類) 類。假設我設置其屬性如下:如何使用屬性不是從對象派生的類

class SomeModel(SomeClass): 
    def __init__(self): 
     self.x = 23 
     self.y = 100 

    def z(self): 
     return self.x + self.y 

在我的情況,我不想處理z作爲一種方法和呼叫是SomeModel().z(),但作爲一個屬性,並稱呼其爲SomeModel().z。此外,該屬性不應該更新或更改。在這種情況下,我把它定義爲一個@property

class SomeModel(SomeClass): 
    def __init__(self): 
     self.x = 23 
     self.y = 100 

    @property 
    def z(self): 
     return self.x + self.y 

    @z.setter 
    def z(self, val): 
     raise NotImplementedError 

現在,我可以使用SomeModel().z就像當年類的屬性。但由於它不是從object衍生@z.setter無法工作,我可以設定值z

some = SomeModel() 
some.z 
>> 123 
some.z = 567 
some.z 
>> 567 

有沒有辦法使用@property爲不是從object派生類的方法嗎?還是有另一種解決方案,可以讓我將我的類方法作爲屬性來處理。我的基本需求是將它們作爲屬性來處理,但如果我也可以覆蓋setdelete方法,那將會更好。

UPDATE:我意識到Model類是從object衍生和我可以使用@property如預期。所以相關的例子是無效的,我改變他們一些。但我的問題仍然有效,因爲我也有一些類不是從object派生的。

+0

當你使用'obj.x = 5'時,如果沒有'object'基類,它將用'5'替換屬性。但是,您可以對對象使用多重繼承,並使setattr正常工作。 – cmd

回答

1

如果您想在舊類的子類中使用新的類風格,那麼執行此操作的一種方法也只是子類Object。

class OldNonObjectClass: 
    a, b = 2, 3 

    @property 
    def c(self): 
     return self.b + self.a 


class SubClass(OldNonObjectClass, object): 
    x, y = 4, 5 

    @property 
    def z(self): 
     return self.x + self.y 

a = OldNonObjectClass() 
print(a.c) 
#5 
a.c = 2 
print(a.c) 
#2 

b = SubClass() 
print(b.z) 
#5 
b.z = 2 
# AttributeError: can't set attribute 
1

您可以使用多重繼承,使之從object繼承太:class Subclass(ParentClass, object):

我從來沒有嘗試過的特性,但它使super()工作,所以我想這回答了你的問題。如果你不想使用它,你也可以實現__getattr__