如何在__init__中设置python属性
我有一个属性类,我希望变成一个属性,但该属性设置在__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__
中设置属性的正确方法是什么?
谢谢, 亚伦。
我没有看到任何真正的问题与您的代码。在__init__
中,该类完全创建,因此可以访问属性。
好的,也许我正在看这个错误的方法。在__init__的位置是已经创建的属性,所以我通过属性访问self.date的调用方式与我对st.date的调用方式相同? – 2010-10-15 12:01:12
是的,(为什么*不喜欢简短的点对点消息?它拒绝发布“是,完全”)。 – 2010-10-15 12:03:43
+1完全正确。我会补充说明__init__中的self._date = None在这段代码中真的没用(你可以在某些情况下使用RAII将属性隐藏变量初始化到getter中('if not hasattr(self,_smth):do initialization。 ..') – ThR37 2010-10-15 12:05:47
class STransaction(object):
"""A statement transaction"""
def __init__(self, date):
self._date = None #1
self.date = date #2
如果要设置代理self._date
对象而不执行setter,请使用#1行。如果您想在启动时执行setter,请使用#2。两种方式都是正确的,这只是你需要什么的问题。
为什么你要设置'_date'为'None'当init清楚地被某个特定的'date'调用?你应该存储正确的值,因此#1是不可行的。 – 2012-12-08 20:09:55
一般来说,在更新属性之前是否有任何理由设置'self._date = None',因为它会立即被新值覆盖? – 2010-10-15 13:39:26
不是。只有第二行不存在才有意义,因为它没有设置属性“_date”来调用getter。 – nerdoc 2013-11-17 14:52:56