如何在 __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。两种方式都是正确的,只是你想做什么。

【讨论】:

为什么你要设置_dateNone 当init 显然是用一些特定的date 调用的?您应该存储正确的值,因此 #1 不可行。

以上是关于如何在 __init__ 中设置 python 属性的主要内容,如果未能解决你的问题,请参考以下文章

如何仅在QLabel中设置文本占用区域的背景色?

如何在tkinter中设置小部件的大小?

在类中设置默认值

Python属性在构造函数中设置值时不使用setter

如何在 PyCharm 中设置 Python 代码模板

如何在 QTreeView 或 QListView 中设置 ItemFlag?