以下哪种是访问类中变量的最佳实践?

时间:2018-12-18 15:36:38

标签: python python-3.x

如果我有一个对象,并且在该对象内定义了一个变量,那么哪种方法最适合访问该变量?

方法一

使用吸气功能

class MyClass:
    def __init__(self):
        self.the_variable = 21 * 2

    def get_the_variable(self):
        return self.the_variable

if __name__ == "__main__"
    a = MyClass()
    print(a.get_the_variable())

方法二

使用@property装饰器

class MyClass:

    def __init__(self):
        self._the_variable = 21 * 2

    @property
    def the_variable(self):
        return self._the_variable

if __name__ == "__main__"
    a = MyClass()
    print(a.the_variable)

方法三

只需直接访问

class MyClass:
    def __init__(self):
        self.the_variable = 21 * 2

if __name__ == "__main__"
    a = MyClass()
    print(a.the_variable)

这些方法中的任何一个是否比其他方法更具Python性?

2 个答案:

答案 0 :(得分:6)

方法3是标准的pythonic启动方式。如果您需要该属性的其他逻辑,过滤或其他某种行为,则可以随时返回并为该属性添加方法,并在以后使用@property装饰器。那就是python的美丽,从简单的可行的东西开始。如果以后需要对属性进行更好的控制,则可以创建属性,而不必更新/更改使用该属性的任何客户端代码。客户端代码将不知道直接访问属性与调用方法之间的区别,因此不必更改。

通过PEP 549

证实了这种意识形态
  

Python的描述符协议指导程序员进行优雅的API设计。如果您的类支持类似数据的成员,并且可能有一天可能需要在更改成员的值时运行代码,则建议您暂时将其声明为类的简单数据成员。如果将来确实需要运行代码,则可以将其更改为“属性”,并且很高兴API不会更改。

答案 1 :(得分:0)

由于它基于程序,因此我认为回答起来并不容易。

class MyClass:
  def __init__(self):
      self.the_variable = 21 * 2

  def get_the_variable(self):
      return self.the_variable

但是,如果您想将类属性传递给某个变量,我认为最好使用getter-setter,因为它更具可读性和可理解性。因为您基本上是在告诉我这个值。例如:

if __name__ == "__main__":
  a = MyClass()

  modified_variable = a.get_the_variable() * 2

相反,如果您仅使用该类属性,则第三个选项a.the_variable更好。

if a.get_the_variable() == 42:
   # do something
else:
   # do something