2014-10-05 1 views
2

제 3 자 라이브러리 (예 : numpy.matrix)의 클래스 A가 있다고 가정합니다. 래퍼 클래스 B로 공용 인터페이스를 확장하고 싶습니다.파생 클래스에 객체 래핑

class B(A): 
    def myMethod(self,arg): 
     return 'spam' 

또한 A 개체에서 B 개체를 만들고 싶습니다. B는 더 이상 속성을 보유하지 것이기 때문에, 난 그냥 정말 B의 행동의 객체를 반환 할 : 파이썬에서 할 수있는 방법이

class B(A): 
    def __new__(cls,a): # type(a)==A 
     return a.castTo(B) # pseudo-code 

있습니까?

마찬가지로 B 개체를 A 개체로 캐스팅하는 방법이 있습니까?

+0

관련 항목 : http://stackoverflow.com/questions/25394550/adding-methods-to-an-existing-class-inst-or-how-to-subclass-an-instance –

+1

@NickT : 감사합니다. . 너무 복잡해 보인다. 언어가 이런 종류의 기본적인 OOP 자료를 지원하지 않습니까? C++에서는 짧은 한 줄짜리가 될 것입니다. 루비 (AFAIK)와 동일합니다. 아니면 파이썬이 이런 식으로 작동하지 않습니까? 혼란 스럽네요 ... –

+0

데코레이터를 사용할 수 있어야합니다. http://thecodeship.com/patterns/guide-to-python-function-decorators/ – user4107395

답변

1

클래스 B의 __new__은 A의 __new__을 호출해야합니다. 다음은 내장 된 list 클래스를 사용하는 간단한 데모입니다.

class mylist(list): 
    def __new__(cls, obj=None): 
     return list.__new__(cls, obj) 

    def mymethod(self, msg): 
     print msg, id(self) 


def main(): 
    a = mylist('abc') 
    print a, id(a) 
    a.mymethod('hello') 


if __name__ == '__main__': 
    main() 

그냥 기존 클래스의 인스턴스에 간단한 기능을 추가하려는 경우, 당신은 이런 종류의 작업을 수행 할 수 있습니다. 이 수행 b.my 그냥 함수가 아닌 방법, 그래서 당신이 그것을 호출 할 때 하지 자기를 전달받을 것을

class A(object): 
    pass 

def silly(arg=None): 
    print 'This is silly', arg 

b = A() 
b.my = silly 
b.my() 

참고.

def __new__(cls, obj=None): 
    return super(mylist, cls).__new__(cls, obj) 

그러나 대부분 :하지만 당신은 list.__new__(cls, obj)를 작성하는 대신 b.my(b)


편집

를 수행하여 "손으로"전달할 수 있습니다, 당신은 super() 함수를 호출 할 수 있습니다 기본 클래스 이름을 사용하는 사례가 더 명확하고 짧아집니다. 나는 인 것을 좋아하는 이유가되어야한다고 생각하지만, 나는이 말을하는 전문가로서는 충분하지 않다. :)

+0

감사합니다. 첫 번째 부분은 예상 한 대답입니다. . 나는 인터넷에서 아무것도 찾을 수 없었다. __new_를 사용하여 []를 반환하지 않았습니다 .____ __ new __ (cls, obj), 그래서 기본 클래스 객체로 끝났습니다. –

+0

[docs] (https://www.python.org/download/releases/2.2.3/descrintro#__new__)의 Guido에서 그 구문을 배웠지 만, 자주 사용하지는 않았습니다. –

관련 문제