【问题标题】:Python Classes Best PracticesPython 类最佳实践
【发布时间】:2014-03-02 07:55:49
【问题描述】:

我想知道在 Python 中使用 OPP/Classes/Instances 时,在读写类的属性/变量时是否应该始终使用 getAttr()/setAttr()。还是直接处理变量/属性(例如 self.my_attr = "some_value")会更好?

直接访问类属性

class MyClass(object):
    def __init__(self):
        super(MyClass, self).__init__()
        self.my_attr = 'My_Value'

    def doSomething(self):
        localVariable = self.my_attr
        print localVariable

使用类的方法访问类的属性

class MyClass(object):
    def __init__(self):
        super(MyClass, self).__init__()
        self.my_attr = 'My_Value'

    def getMyAttr(self):
        return self.my_attr

    def doSomething(self):
        localVariable = self.my_attr
        print localVariable

稍后编辑:

在阅读“面向对象的思维过程”一书时(Matt Weisfeld:开发者图书馆)……作者在整个过程中不断地陈述:

"...对对象内属性的访问应由对象控制 本身——任何其他对象都不应该直接改变另一个对象的属性……”

"...如果您控制对属性的访问,当出现问题时,您可以 不必担心跟踪可能改变了代码的每一段代码 属性——它只能在一个地方改变(setter)..."

那时我会坚持使用 setter 和 getter。此处建议/提及 Python 的 @property 和 @.setter 使其更加容易。

【问题讨论】:

  • 关于你的编辑:别人的想法一般不会不经过反思就被采纳。只是因为它印在一本书上,事实不会成为真实的。 “最佳”实践仅对于给定的“最佳”值和给定的“实践”值是“最佳”的。将每一点都放入 setter 和 getter 会导致 Java 的 getter-setter-hell(我觉得任何 Java 代码都是 90% 的样板代码),相信“我们都是成年人”(正如 python 的禅宗所暗示的那样)可能是更糟糕。也许真相就在某个地方,介于两个极值之间。

标签: python class methods instance attr


【解决方案1】:

您应该直接访问该变量。

如果您随后需要添加一些逻辑来获取/设置值,请将其转换为 property

【讨论】:

    【解决方案2】:

    考虑使用@property 装饰器,而不是后一个示例。

    class MyClass(object):
        def __init__(self):
            super(MyClass, self).__init__()
            self.__my_attr = 'My_Value'
    
        @property
        def my_attr(self):
            return self.__my_attr
    
        def doSomething(self):
            localVariable = self.__my_attr
            print localVariable
    

    只有在你有充分理由保护会员时才使用它,例如如果你想验证它的值:

    class Person:
        @property
        def age(self): return self.__age
    
        @age.setter
        def age(self, value):
            if value < 0: raise Exception('Age out of bounds.')
            self.__age = value
    
    p = Person ()
    p.age = 14
    print (p.age)
    p.age = -34
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-12
      • 1970-01-01
      • 2018-01-31
      • 2011-04-25
      • 2013-11-08
      • 1970-01-01
      • 1970-01-01
      • 2011-07-11
      相关资源
      最近更新 更多