【问题标题】:Python3.6, property which is better accessing method?Python3.6,属性哪个访问方式更好?
【发布时间】:2018-09-26 20:00:39
【问题描述】:

我是一个新手 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

【问题讨论】:

  • 你为什么还要使用property?一个简单的属性self.bar = 3 不够吗?
  • @property 方法的目标是什么?据我所知,它是不需要的。
  • 我编码它是因为它是 getter 的 Pythonic 方式。通过here,这是使其成为私有和只读变量的方法
  • 你不应该关心 Python 中的隐私。可以直接对变量进行属性访问。然后,如果您需要添加某种计算/验证,您可以添加一个属性来修改内部行为,而无需修改类的外部 API。

标签: python-3.6


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 2020-01-25
    • 1970-01-01
    • 2012-09-28
    • 2014-03-11
    • 1970-01-01
    • 2011-09-30
    相关资源
    最近更新 更多