Python类最佳实践

时间:2014-02-05 17:57:04

标签: python class methods instance attr

我想知道在使用Python中的OPP / Classes / Instances时,我应该总是使用 getAttr()/ setAttr()来读取 - 从类的属性/变量。或直接处理变量/属性(例如self.my_attr =“some_value”)会是更好的做法吗?

直接访问Class attr

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的方法访问Class的attr

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:开发人员的图书馆)......作者在整个过程中不断说明:

“...对象内的属性访问应该由对象控制 本身 - 没有其他对象应该直接更改另一个对象的属性......“

“...如果你控制对属性的访问,当出现问题时,你就可以了 不必担心跟踪可能已经改变的每一段代码 属性 - 它只能在一个地方(设置者)改变......“

然后我会坚持使用二传手和吸气剂。这里建议/提到Python的@property和@ .setter使它更容易。

2 个答案:

答案 0 :(得分:10)

您应该直接访问变量。

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

答案 1 :(得分:7)

而不是后一个示例,请考虑使用@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