在Python中使用访问器的正确方法?

时间:2013-03-29 16:08:29

标签: python python-2.7

这是如何在Python中使用属性“Speed”定义类“Car”的?我的背景是Java,似乎没有在Python中使用get / set方法。

class Car(object):
    def __init__(self):
        self._speed = 100

    @property
    def speed(self):
        return self._speed

    @speed.setter
    def speed(self, value):
        self._speed = value

3 个答案:

答案 0 :(得分:24)

在Python中,我们通常避免 getter和setter。只需拥有.speed属性:

class Car(object):
    speed = 0

    def __init__(self):
        self.speed = 100

请注意Python is not Java的动机和更多需要避免的陷阱:

  

在Java中,你必须使用getter和setter,因为使用公共字段使你没有机会回过头来改变主意,使用getter和setter。所以在Java中,你可能也会提前做好准备工作。在Python中,这很愚蠢,因为您可以从普通属性开始并随时改变主意,而不会影响该类的任何客户端。所以,不要写getter和setter。

在获取,设置或删除属性时,如果您确实需要执行代码,请使用property。验证,缓存,副作用等都是属性的公平使用案例。只是在必要之前不要使用它们。

答案 1 :(得分:0)

我会选择那些属性:

class Car(object):
    def __init__(self):
        self.speed = 100

你可以改变并以完全相同的方式获得它。 @property表示法可能更多地用于包装使用Java / C get / set方法,虚拟属性或者需要操作输入值的类。

我经常在GUI类中使用它,我可以根据窗口小部件的更改属性轻松强制重绘屏幕,自定义事件系统。

答案 2 :(得分:0)

由于技术上属性在Python中从不是私有的,因此get / set方法不被视为“pythonic”。这是访问对象属性的标准方法:

class MyClass():
    def __init__(self):
        self.my_attr = 3

obj1 = MyClass()
print obj1.my_attr #will print 3
obj1.my_attr = 7
print obj1.my_attr #will print 7

当然,您仍然可以使用getter和setter,并且可以通过将__添加到您的属性来模仿私有成员:

class MyClass():
    def __init__(self):
        self.__my_attr = 3
    def set_my_attr(self,val):
        self.__my_attr = val
    def get_my_attr(self):
        return self.__my_attr

obj1 = MyClass()
print obj1.get_my_attr() #will print 3
obj1.set_my_attr(7)
print obj1.get_my_attr() #will print 7

__“变形”变量名称:从定义了classname的某个类__attr之外,__attr重命名为_classname__attr;在上面的示例中,我们可以简单地使用obj1._MyClass__my_attr,而不是使用getter和setter。因此__不鼓励外部使用属性,但它并不像Java private修饰符那样禁止它。

正如您在问题中提到的,还有Python中提供的属性。属性的优点是,您可以使用它们来实现返回或设置值的函数,这些函数从类外部看起来只是作为普通成员属性进行访问。