2010-10-15 90 views
18

我有一个属性类,我希望变成一个属性,但该属性设置在__init__。不知道这应该如何完成。如果没有__init__设置PROPERT这很简单和行之有效的如何在__init__中设置python属性

import datetime 

class STransaction(object): 
    """A statement transaction""" 
    def __init__(self): 
     self._date = None 

    @property 
    def date(self): 
     return self._date 

    @date.setter 
    def date(self, value): 
     d = datetime.datetime.strptime(value, "%d-%b-%y") 
     self._date = d 

st = STransaction() 
st.date = "20-Jan-10" 

但是一旦初始化需要发生在__init__它变得更复杂,我不知道正确的行动当然。

class STransaction(object): 
    """A statement transaction""" 
    def __init__(self, date): 
     self._date = None 

奇怪的是,以下似乎工作,但闻起来非常糟糕。

class STransaction(object): 
    """A statement transaction""" 
    def __init__(self, date): 
     self._date = None 
     self.date = date 

    @property 
    def date(self): 
     return self._date 

    @date.setter 
    def date(self, value): 
     d = datetime.datetime.strptime(value, "%d-%b-%y") 
     self._date = d 

__init__中设置属性的正确方法是什么?

谢谢, 亚伦。

+1

一般来说,在更新属性之前是否有任何理由设置'self._date = None',因为它会立即被新值覆盖? – 2010-10-15 13:39:26

+0

不是。只有第二行不存在才有意义,因为它没有设置属性“_date”来调用getter。 – nerdoc 2013-11-17 14:52:56

回答

17

我没有看到任何真正的问题与您的代码。在__init__中,该类完全创建,因此可以访问属性。

+0

好的,也许我正在看这个错误的方法。在__init__的位置是已经创建的属性,所以我通过属性访问self.date的调用方式与我对st.date的调用方式相同? – 2010-10-15 12:01:12

+6

是的,(为什么Stackoverflow不喜欢简短的点对点消息?它拒绝发布“是,完全”)。 – 2010-10-15 12:03:43

+0

+1完全正确。我会补充说明__init__中的self._date = None在这段代码中真的没用(你可以在某些情况下使用RAII将属性隐藏变量初始化到getter中('if not hasattr(self,_smth):do initialization。 ..') – ThR37 2010-10-15 12:05:47

4
class STransaction(object): 
    """A statement transaction""" 
    def __init__(self, date): 
     self._date = None #1 
     self.date = date #2 

如果要设置代理self._date对象而不执行setter,请使用#1行。如果您想在启动时执行setter,请使用#2。两种方式都是正确的,这只是你需要什么的问题。

+1

为什么你要设置'_date'为'None'当init清楚地被某个特定的'date'调用?你应该存储正确的值,因此#1是不可行的。 – 2012-12-08 20:09:55