在Python中调用或在_init__中初始化属性

在Python中调用或在_init__中初始化属性,python,properties,Python,Properties,在_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

在_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

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

这类定义的例子如下:

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

对于您的特定示例,您可以在文档中阅读更多内容,这两种方法都过于复杂。尝试:

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

在类定义中定义它们是什么样子的?你是指类属性,还是指实例属性?因为
self.\u bar
在这里是一个实例属性,没有类属性。在
中执行
self.\u bar=None
就是定义它。我的意思是实例属性。它没有封装变量。此外,在我们确定Bar属性是否会被调用之前,它会使用内存创建一个新的Bar。@travis1097当您说它没有封装变量时,您的意思是它应该是
self.\u Bar=Bar()
?因为除此之外还不清楚你的意思。OP实际上是在讨论实例属性。这种情况不适用。