2011-08-16 5 views
2

기본 클래스의 인스턴스가 있고이 인스턴스를이 기본 클래스의 자식 클래스의 인스턴스로 만들고 싶습니다. 어쩌면 나는 잘못된 방식으로 문제를 해결할 것이고 OOP에서 이해할 수없는 중요한 것이있다. 코드는 설명하기위한 것일 뿐이며 매우 다른 접근 방식을 제안 할 수 있습니다. 어떤 도움을 주셔서 감사합니다. 상속 : 기본 클래스 인스턴스를 자식 클래스 인스턴스로 변환

class Car(object): 
    def __init__(self, color): 
     self.color = color 

    def drive(self): 
     print "Driving at 50 mph" 

class FastCar(Car): 
    def __init__(self, color, max_speed=100): 
     Car.__init__(self, color) 
     self.max_speed = max_speed 

    def drive_fast(self): 
     print "Driving at %s mph" %self.max_speed 

one_car = Car('blue') 

# After the instanciation, I discovered that one_car is not just a classic car 
# but also a fast one which can drive at 120 mph. 
# So I want to make one_car a FastCar instance. 

나는 매우 비슷한 질문을 볼 수 있지만 답변 중 누구도 내 문제에 맞는 없습니다 : 나는 FastCar에게 빨리 운전하는 방법을 알 것 자동차 ​​래퍼를 만들고 싶어하지 않는

  • 를 : 나는 FastCar가 Car를 확장하기를 정말로 원한다. (: def __new__(cls, color, max_speed=100, baseclassinstance=None) 예)

  • 은 정말 __new__이 자동차의 새로운 인스턴스 또는 내가 그에게 준 인스턴스를 반환 할 경우 인수에 대한 몇 가지 테스트를하고 결정하는 FastCar에서 __new__ 방법을 사용하지 않습니다.

+0

왜 그냥하지 : one_car = FastCar (one_car.color, 120)? 실제로 상속이나 아무것도 아니지만 작동해야합니다. – Bogdan

+3

OOP 디자인이 약간 느껴집니다. 나는 FastCar가 drive()를 구현하지만 빠른 속도 (drive_fast로 구현 한 것)로 구현할 것이라고 생각합니다. 지금 가지고있는 것과 같이, 호출자는 같은 메소드를 호출하고 다양한 메소드가 해당 메소드를 적절하게 구현하도록 (좋은) 대신 호출 할 메소드를 아는 유형을 알아야한다. FastCar 클래스의 끝 부분에'drive = drive_fast'를 추가하면됩니다. – PaulMcG

+0

확인.더 나은 예 :'FastCar'는'drive_fast' 메쏘드가 없지만'Car'에는 존재하지 않는'추월'메소드입니다. – Andy

답변

0

"복사 생성자"의 C++ 개념을 빌려 이와 같은 작업을 수행 할 수 있습니다.

Car의 생성자가 Car 인스턴스를 가져 와서 해당 속성을 모두 복사 할 수있게합니다. 그런 다음 FastCar는 Car 인스턴스 또는 FastCar 인스턴스를 받아들입니다.

그렇다면 자동차를 변환하려면 one_car = FastCar(one_car)을 입력하면됩니다. 이 옵션은 동일한 Car를 가리키는 원래 Car 객체에 대한 참조에는 영향을 미치지 않습니다.

2

이것은 표준 방법입니다. 실제 클래스의 레이아웃에 따라

, 당신은 같은 것을 할 수 있습니다 :

classic = Car('blue') 

classic.__class__ = FastCar 
classic.__dict__.update(FastCar(classic.color).__dict__) 

classic.drive_fast() 

을하지만 난 그것을 권하고 싶지 않다 - 다른 그것이 해킹, 항상 작동하지 않습니다, 그리고 방법은 더 깨끗합니다.

편집 : @ PaulMcGuire의 의견에 기본적으로 추가 할 내용이 있습니다. 그 충고를 따르십시오, 맞습니다.

0

하나의 클래스를 사용하지 않는 이유는 무엇입니까?

class Car(object): 
    def __init__(self, color, max_speed = 50): 
     self.color = color 
     self.max_speed = max_speed 
    def drive(self): 
     print "Driving at %s mph"%self.max_speed 

c=Car('blue') 
c.max_speed = 100 
0

인스턴스 생성 후 살아있는 객체의 유형 (클래스)을 변경하는 것은 OOP에서 일반적이지 않습니다. 나는이 언어를 간신히 알 수있다. 더러운 해킹. 유형 (클래스)의 모든 목적은 객체가 수행 할 수있는 작업과 수행 할 수없는 작업을 미리 아는 것입니다. 이와 비슷한 것을 원하면 OOP에 대한 아이디어를 잘못 생각한 것일 수 있습니다.

+0

OOP를 처음 접한다면 캐릭터 배열에서 객체의 유형을 변경하여 문자열을 만드는 것을 생각할 것입니다. 그것은 낡은 것의 내용으로부터 새로운 대상을 만들고 있습니다. 이것은 그가 정말로하고 싶어하는 것입니다 (그는 단지 그것을 모릅니다). – agf

+0

고마워요,하지만 이걸 내가하고 싶은게 아닌 것 같아요. 나는 정말로 새로운 객체를 만들고 싶지 않습니다. – Andy

관련 문제