Python3.6,属性哪种访问方法更好?

时间:2018-04-17 00:44:31

标签: python-3.6

我是一名新手python程序员。

我有一些关于财产的小问题,哪个更好。

在类中,哪个是按属性或变量本身访问变量的标准?

例如,下面的代码之间哪个是更好的方法,baz1和baz2? baz1和baz2之间有什么区别吗?

class Foo:
    def __init__(self):
        self._bar = 3

    @property
    def bar(self):
        return self._bar

    def baz1(self):
        return self.bar+1

    def baz2(self):
        return self._bar+1

1 个答案:

答案 0 :(得分:1)

如果您的目标是阻止修改变量,则可以在没有setter的情况下对属性使用属性。如果有人试图修改该值,这将引发异常。请注意,这不能确保无法修改变量:

class Foo:
    def __init__(self):
        self._bar = 3

    @property
    def bar(self):
        return self._bar

foo = Foo()
foo._bar  # output 3
foo.bar  # output 3
foo.bar = 1 # raise an exception
foo._bar = 1  # _foo will be change to 1

如果您只想访问和修改实例外的属性。你不必使用任何财产之王:

class Foo:
    def __init__(self):
        self.bar = 3

foo = Foo()
foo.bar  # output 3
foo.bar = 1  # _foo will be change to 1

如果要对输入进行一些计算或验证,可以使用get / set属性:

class Foo:
    def __init__(self):
        self._bar = 3

    @property
    def bar(self):
        return self._bar + 1

    @bar.setter
    def bar(self, new_bar):
        assert isinstance(new_bar, int)
        self._bar = new_bar

foo = Foo()
foo.bar  # output 4
foo.bar = 1  # _foo will be change to 1
foo.bar = 'bar'  # raise assertion error