如何在 __init__ 中设置 python 属性
Posted
技术标签:
【中文标题】如何在 __init__ 中设置 python 属性【英文标题】:How to set a python property in __init__ 【发布时间】:2011-04-25 21:49:55 【问题描述】:我有一个类,我希望将其属性转换为property
,但该属性是在__init__
中设置的。不知道应该怎么做。无需在__init__
中设置属性,这很容易并且效果很好
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__
中设置属性的正确方法是什么?
谢谢, 亚伦。
【问题讨论】:
一般来说,有什么理由在更新属性之前设置self._date = None
,因为它会立即被新值覆盖?
没有。仅当第二行不存在以防止在没有设置属性“_date”的情况下调用 getter 时才有意义
【参考方案1】:
我认为您的代码没有任何实际问题。在__init__
中,类已完全创建,因此属性可访问。
【讨论】:
好的,所以也许我看错了。在 init 点是已经创建的属性,所以我对 self.date 的调用通过属性访问与我对 st.date 的调用相同吗? 是的,完全正确(为什么 *** 不喜欢简短、中肯的消息?- 它拒绝只发布“是的,完全正确”)。 +1 完全正确。我要补充一点,init 中的 self._date = None 在这段代码中真的没用(在某些情况下,您可以使用 RAII(if not hasattr(self,_smth): do initialization...
)将属性隐藏变量的初始化放在 getter 中跨度>
【参考方案2】:
class STransaction(object):
"""A statement transaction"""
def __init__(self, date):
self._date = None #1
self.date = date #2
如果您想设置代理字段self._date
而不执行您的设置器,请使用#1 行。如果您想在启动时执行设置器,请使用#2。两种方式都是正确的,只是你想做什么。
【讨论】:
为什么你要设置_date
到None
当init 显然是用一些特定的date
调用的?您应该存储正确的值,因此 #1 不可行。以上是关于如何在 __init__ 中设置 python 属性的主要内容,如果未能解决你的问题,请参考以下文章