如何在__init__中设置python属性

Aar*_*lay 24 python properties

我有一个具有属性的类,我希望将其转换为属性,但此属性设置在其中__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"
Run Code Online (Sandbox Code Playgroud)

但是一旦初始化需要发生,__init__它会变得更复杂,我不确定正确的行动方案.

class STransaction(object):
    """A statement transaction"""
    def __init__(self, date):
        self._date = None
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

谢谢,亚伦.

Flo*_*yer 23

我没有看到您的代码存在任何实际问题.在__init__,类完全创建,因此可访问属性.

  • 是的,确切地说(为什么Stackoverflow不喜欢短暂的,点到点的消息? - 它拒绝发布"是的,确切地说"). (6认同)

Mar*_*mro 5

class STransaction(object):
    """A statement transaction"""
    def __init__(self, date):
        self._date = None #1
        self.date = date  #2
Run Code Online (Sandbox Code Playgroud)

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

  • 当明确用某些特定的“日期”调用init时,为什么要将“ _date”设置为“ None”?您应该存储正确的值,因此#1不可行。 (2认同)