【问题标题】:Accessor & Mutator methods (Python)Accessor 和 Mutator 方法 (Python)
【发布时间】: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)直到你需要逻辑。

标签: python mutators


【解决方案1】:

使用myCar.set_make=('Porche'),您将Car 类的这个成员设置为'Porche' 字符串,但您没有调用该方法。

只需删除=即可解决:

myCar.set_make('Porche')
myCar.get_make() # Porche

此外,正如@DSM 所指出的,set_make 的参数存在错误:

def set_make(self, make):
    self.__make = make # carMake is not defined!

但是,this use of getters and setters in Python is strongly discouraged。如果您出于任何原因需要类似的东西,请考虑使用properties

【讨论】:

  • set_make 中还有一个错误(carMake 而不是make),所以它还不能正常工作,但你对主要问题是正确的。
  • 谢谢你,但由于某种原因,我收到一条错误消息:
  • 这是我第一次使用这个资源,我刚刚开始了编程课程的介绍,所以感谢您的耐心等待!
【解决方案2】:
new_car = Car(...)
new_car2 = Car(...)

new_car._make = 'Ford'
new_car2.make = 'Jetta'

print new_car._make
print new_car2.make

【讨论】:

  • 这个答案对这个问题有什么价值?由于您花时间将其发布为对一年前的问题的回答,我很好奇。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多