2009-06-01 3 views
3

EC2 인스턴스를 관리하려면 boto을 사용하고 있습니다. 그것은 Instance 클래스를 제공합니다. 내 특정 요구를 충족시키기 위해 하위 클래스를 만들고 싶습니다. boto는 인스턴스를 가져 오기위한 쿼리 인터페이스를 제공하므로 클래스간에 변환 할 항목이 필요합니다. 이 해결책은 효과가있는 것처럼 보이지만 클래스 속성을 변경하는 것은 사기스러운 것처럼 보입니다. 더 좋은 방법이 있습니까?클래스 인스턴스를 하위 클래스로 캐스팅

from boto.ec2.instance import Instance as _Instance 

class Instance(_Instance): 
    @classmethod 
    def from_instance(cls, instance): 
     instance.__class__ = cls 
     # set other attributes that this subclass cares about 
     return instance 

답변

7

하위 클래스로 캐스팅하지 않았습니다. 나는 주조가 항상 좋은 정책이라고 생각하지 않는다.

대신 래퍼 또는 외관을 고려해보십시오.

class MyThing(object): 
    def __init__(self, theInstance): 
     self.ec2_instance = theInstance 

지금, 당신은 당신이 원하는만큼 MyThing을 하위 클래스 당신은 전혀 boto.ec2.instance.Instance를 캐스팅 할 필요가 없습니다. 그것은 당신의 객체에서 더 많거나 적은 불투명 한 요소로 남아 있습니다.

+0

+1 가능한 경우 상속을 통한 합성. –

+0

서브 클래 싱하려는 클래스는 내가 만드는 추가 (실제로는 몇 가지 특성)보다 훨씬 복잡합니다. 래핑 된 클래스의 모든 기능을 노출하려면 많은 래핑 된 함수/속성이 필요합니다. 저는 컴포지션과 상속 문제를 이해 합니다만,이 경우 컴포지션 경로는 가치가있는 것보다 더 어려워 보입니다. – iconoplast

+1

@iconoplast : "포장 된 함수/속성이 많이 필요합니다." 왜? 인스턴스의 이름은 항상 myThing.ec2_instance입니다. EC2 인스턴스 속성과 메서드를 직접 호출 할 수없는 이유는 무엇입니까? 또 무슨 일이 벌어지고 있니? –

관련 문제