2013-04-07 7 views
4

파이썬에서 캡슐화를 파악하려고합니다. 나는 셸에서 간단한 테스트를 수행하여 어떻게 작동하는지보고 있었고 예상했던 것처럼 작동하지 않았습니다. 그리고 나는 그것을 작동시킬 수 없다.액세서 및 뮤 테이타 메서드 (파이썬)

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하지 않습니다 여기 내 코드는? 고맙습니다.

+2

인스 턴 스 속성의 모든 밑줄은 무엇입니까? '자기 .__ 속도'? 그리고 왜이 모든 방법을 어쨌든 만들고 있습니까? 'myCar.set_make ("Porsche")/myCar.get_make()'는'myCar.make = 'Porsche'와'myCar.make'를 통해 어떤 이점이 있다고 생각합니까? – DSM

+3

이와 같은 API를 노출 할 이유는 없습니다. 때로는 getter/setter 메소드가있는 이유가 있지만 내장 된 '속성'을 사용하여 숨겨야합니다. 그리고 클라이언트 코드의 관점에서 보았을 때 일반 속성처럼 보이게하기 때문에 논리가 필요할 때까지 사용하면됩니다 (간단한 getter/setter가 아닌). – delnan

답변

6

myCar.set_make=('Porche')의 경우이 멤버를 'Porche' 문자열로 Car 클래스로 설정하고 있지만이 메서드는 호출하지 않습니다.

는 그냥 = 그것을 해결하기 위해 제거 :

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을 사용해보십시오.

+3

'set_make' ('make '대신'carMake')에 버그가있어서 아직 잘 작동하지 않지만 주요 문제는 옳습니다. – DSM

+0

고맙습니다. 그러나 어떤 이유로 든 오류 메시지가 나타납니다. – user2255444

+0

감사합니다. – user2255444

-1
new_car = Car(...) 
new_car2 = Car(...) 

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

print new_car._make 
print new_car2.make 
+1

그리고이 답변이 어떤 가치를 질문에 추가합니까? 당신이 1 년 된 질문에 대한 대답으로 이것을 게시 할 시간을 가졌기 때문에 저는 호기심이 생깁니다. – EWit