2011-02-26 20 views
2

對不起,如果這已經存在於問題檔案中的某處,但我不確定如何提問並且搜索沒有導致任何重大啓示。Python - 將類屬性設置爲依賴於同一類中其他屬性的值

在Python(2.6.x的),我創建了一個類

class timetuple(object): 
    def __init__(self): 
     self.weekday = 6 
     self.month = 1 
     self.day  = 1 
     self.year = 2011 
     self.hour = 0 
     self.min  = 0 
     self.sec  = 0 
    def jd(self): 
     self.jd = julian_date(self) 

def julian_date(obj): 
    (Code to calculate a Julian Date snipped) 

start = timetuple() 
start.day = 23 
start.month = 2 
start.year = 2011 
start.hour = 13 
start.min = 30 
start.sec = 0 

print start.__dict__ 
start.jd() 
print start.__dict__ 
print start.jd 

它返回

{'hour': 13, 'min': 30, 'month': 2, 'sec': 0, 'weekday': 6, 'year': 2011, 'date': 23, 'day': 1} 
{'hour': 13, 'min': 30, 'month': 14, 'jd': 2455594.0625, 'sec': 0, 'weekday': 6, 'year': 2010, 'date': 23, 'day': 1} 
2455594.0625 

所以.jd屬性(或者我把這個函數或方法?我不確定這裏的術語是否真實)在start.jd()調用之前不存在。有沒有辦法我可以重寫這個讓它總是基於timetuple類中的當前值存在,或者在調用.jd屬性時讓它自己更新?

我知道我可以只是在初始化(個體經營)款作出.jd財產做了很長的路,然後像做

start = timetuple() 
start.jd = julian_date(start) 

,但我想知道如何建立我的課更誠實:)

+0

「.jd」在您的案件被定義爲實現方法具了,裏面牛逼帽子法,重新認定自己是一種財產。此代碼可能無法按預期工作,因爲您使用.jd作爲方法名稱和實例屬性 – jsbueno

+0

琥珀的答案是很好的答案;但你在這裏有什麼奇怪的。你爲什麼不把'self.jd = julian_date(self)'放在'__init __()'中? – senderle

+0

@senderle:將它放入'__init__'節中時,它只會在創建類的實例時更新一次,而在其他屬性隨後發生更改時不會更新.jd屬性。 – Ryan

回答

9

要真正地定義一個屬性,而不是一個變量:

class A(object): 

    def __init__(self): 
     self.a = 1 
     self.b = 1 

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

foo = A() 
print foo.a_plus_b # prints "2" 
foo.a = 3 
print foo.a_plus_b # prints "4" 
foo.b = 4 
print foo.a_plus_b # prints "7" 
+0

啊,我們走吧!這對我來說很有用,感謝這個非常明確的例子! – Ryan

相關問題