Python类的最佳实践

3
我在使用Python中的面向对象编程(OPP)/类/实例时,是否应该始终使用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,这使得它甚至更容易。


1
关于您的编辑:其他人的想法通常不应盲目采纳。仅仅因为一件事情被印在书上,并不意味着它就是真实的。"最佳"实践只有在特定的"最佳"价值和"实践"价值下才是"最佳"的。将每一个小细节都放入getter和setter中会导致Java的getter-setter地狱(我感觉任何Java代码都是90%的样板代码),相信"我们都是成年人"(正如Python之禅所建议的)可能会更糟。也许真相就在两个极端之间。 - Hyperboreus
2个回答

12

你应该直接访问变量。

如果之后需要添加一些获取/设置值的逻辑,请将其转换为property(属性)。


10

考虑使用@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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接