【问题标题】:Initialize properties when called or in __init__ in Python在 Python 中调用或在 __init__ 中初始化属性
【发布时间】:2013-08-15 13:29:58
【问题描述】:

在 __init__ 方法或 getter 中定义私有类变量更好吗?似乎在调用之前不需要定义变量。

init中定义变量:

class Foo(object):
    def __init__(self):
        self._bar = None

    @property
    def bar(self):
        if self._bar is None:
            self._bar = Bar()
        return self._bar

    @bar.setter
    def bar(self, value):
        self._bar = value

在 getter 中定义它:

class Foo(object):
    @property
    def bar(self):
        if not hasattr(self, '_bar'):
            self._bar = Bar()
        return self._bar

    @bar.setter
    def bar(self, value):
        self._bar = value

【问题讨论】:

  • 在类定义中定义它们是什么样的?
  • 您是指类属性,还是实际上是指实例属性?因为self._bar这里是实例属性,不是类属性。
  • __init__() 中做一个self._bar = None 定义它。
  • 我的意思是实例属性。

标签: python properties


【解决方案1】:

不需要在需要类属性之前定义它们,至少从解释器的角度来看是这样,但是有一个巨大的收获,因为它极大地提高了代码的可读性。为此,您应该只在类定义中定义它们,而不是在 init 中。

此类定义的示例如下:

class MyClass:
    """A simple example class"""
    i = 12345
    def f(self):
        return 'hello world'

您可以在文档http://docs.python.org/2/tutorial/classes.html中阅读更多内容

【讨论】:

  • OP 实际上是在谈论实例属性。这不适用于这种情况。
【解决方案2】:

对于您的特定示例,这两种方式都过于复杂。试试:

class Foo(object):
    def __init__(self):
        self.bar = Bar()

【讨论】:

  • 这不封装变量。此外,它会在我们确定是否会调用 bar 属性之前使用内存创建一个新的 Bar。
  • @travis1097 当你说它不封装变量时,你的意思是它应该是self._bar = Bar()?因为否则不清楚你的意思。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-05
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-06
相关资源
最近更新 更多