【发布时间】:2013-03-29 20:38:14
【问题描述】:
我正在尝试找出 Python 中的封装。我在 shell 中做了一个简单的小测试,看看它是如何工作的,它不像我期望的那样工作。我无法让它工作。这是我的代码:
class Car:
def __init__(self, carMake, yrMod):
self.__make = carMake
self.__yearModel = yrMod
self.__speed = 0
#Mutator Methods
def set_make(self, make):
self.__make = carMake
def set_model(self, yrMod):
self.__yearModel = yrMod
#def set_speed(self, speed):
#self.__speed = speed
#Accessor Methods
def get_make(self):
return self.__make
def get_yearModel(self):
return self.__yearModel
def get_speed(self):
return self.__speed
myCar=Car('Ford', 1968)
myCar2=Car('Nissan', 2012)
myCar.get_make()
'Ford'
myCar.set_make=('Porche')
myCar.get_make()
'Ford'
为什么 myCar.set_make 不把 Ford 改成 Porche?谢谢。
【问题讨论】:
-
实例属性中的所有这些下划线是什么意思,例如
self.__speed?你为什么要制作所有这些方法?你认为myCar.set_make("Porsche")/myCar.get_make()比myCar.make = 'Porsche'和myCar.make有什么优势? -
没有理由公开这样的 API。有时使用 getter/setter 方法是有原因的,但应该使用内置的
property隐藏它们。因为从客户端代码的角度来看,这使得它们就像普通属性一样,所以你应该只使用那些(而不是微不足道的 getter/setter)直到你需要逻辑。