Python类最佳实践

alp*_*ric 1 python methods class 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
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)

稍后编辑:

阅读"面向对象思想过程"一书(Matt Weisfeld:开发人员图书馆)......作者在其中不断说明:

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

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

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

Dan*_*man 11

您应该直接访问变量.

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


Hyp*_*eus 8

而不是后一个例子,考虑使用@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
Run Code Online (Sandbox Code Playgroud)

仅在您有充分理由保护该成员时才使用它,例如,如果您想验证其值:

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
Run Code Online (Sandbox Code Playgroud)