2010-01-29 5 views
2

파이썬에서 모든 클래스를 수정하고 싶습니다. 예를 들면 str과 int 그리고 Person (object) 같은 다른 것.파이썬 클래스 수정하기

속성을 추가하고 메소드가 작동하는 방식을 변경하고 싶습니다.

이 중 가장 적합한 방법은 무엇입니까? 메타 클래스?

+2

사용 사례는 무엇입니까? –

+0

Python을위한 오염 모드 구현. –

+2

또한 언어의 모든 연산자를 다시 구현할 수 있어야합니다. 나는 네가 원하는 것을 할 수 없을 것이라고 생각한다. –

답변

0

자바 스크립트의 프로토 타입 속성과 같이 클래스를 직접 편집 할 수 없으므로 클래스를 하위 클래스로 만드는 것이 좋습니다. 이렇게하면 원하는 기능을 추가하고 어디서나 강제로 사용할 수 없습니다.

+0

자, 프로그래밍 방식으로 어떻게 할 수 있습니까? 이 수정을 많은 수업에 적용하고 싶습니다. 나는 그들 모두를 손으로 확장하기를 원하지 않는다. –

+0

클래스의 수정 된 버전을 반환하는 클래스 데코레이터를 사용할 수 있습니다. 그런 다음 수정해야하는 각 클래스의 맨 위에 "@yourdecorator"만 추가하면됩니다. – AndiDog

1

기본 제공 클래스는 수정할 수 없지만 기본 제공 클래스 (또는 기타 다른 클래스)는 동일한 이름으로 숨길 수 있습니다.

예를 들어, 초기 값이 23 인 새로운 속성 "foobar"와이 클래스의 모든 인스턴스에 새로운 속성 "murf"가 추가 된 것으로 가정합니다. 45 여기 하나의 방법입니다 : '챠오', 23와 같은 베어 리터럴은 여전히 ​​실제 클래스에 속하는 것으로

def changedclass(cls): 
    def __init__(self, *a, **k): 
    cls.__init__(self, *a, **k) 
    self.murf = 45 
    return type(cls.__name__, (cls,), {'foobar': 23, '__init__': __init__}) 

def changemany(changed, classes_by_module): 
    for module, classnames in classes_by_module.iteritems(): 
    for name in classnames: 
     cls = getattr(module, name) 
     subcls = changed(cls) 
     setattr(module, name, subcls) 

import __builtin__ 
import mymod 
changemany(changedclass, {__builtin__: ('int', 'str'), mymod: ('Person',)}) 

주 - 그것을 바꿀 수있는 방법은 없습니다; "가짜"클래스를 사용하려면 str('ciao')int(23)을 사용해야합니다.

+0

어떻게 변경된 클래스에 대해 \ _ \ _ add__ 메소드를 오버로드 할 수 있습니까? –

+0

정확히 같은 방식입니다. –

3

파이썬 코드로 정의 된 클래스 (내장 클래스에서는 작동하지 않음)에서 속성을 재 할당하여이 작업을 수행 할 수 있지만 실제로 그렇게하지 마십시오. 하위 클래스를 하위 클래스로 사용하거나 클래스의 인스턴스를 자신의 메서드를 추가하는 대신 인수로 사용하는 함수를 작성하십시오. 여러분이 염두에 두어야 할 일을하는 것은 어색하고 깨지기 쉬운 코드로 이어집니다. 특히 여러 라이브러리를 동시에 사용하면 결국 같은 클래스에서이 작업을 시도하게됩니다.

이 방법으로 해결하려는 실제 문제가 있습니까?

0

서브 클래스 :


class int(int): 
    def foo(self): 
    print "foo" 

int(2).foo()