这是如何在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
答案 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中提供的属性。属性的优点是,您可以使用它们来实现返回或设置值的函数,这些函数从类外部看起来只是作为普通成员属性进行访问。