2016-07-12 3 views
-2

나는 파이썬에서 일부 개체의 기능을 변경할 수있는 방법이 있었다는 것을 어딘가에 본 적이변경 파이썬 객체의 기능

def decorable(cls): 
    cls.__lshift__ = lambda objet, fonction: fonction(objet) 
    return cls 
당신이와 함께, 루비 등의 작업을 수행 할 수 있는지 궁금

:

number.times 

위의 함수를 int 클래스에 적용하여 미리 정의 된 클래스를 실제로 변경할 수 있습니까? 그렇다면 어떻게해야 내가 할 수있는 아이디어가 있습니까? 그리고 당신은 저에게 모든 기능 (예 : lshift)을 보여줄 수있는 파이썬의 문서를 연결할 수 있습니까?

+0

파이썬의 모든 기능을 변경할 수 있습니다. (내장 된 클래스와 함수를 제외하고 약간의 예외가 있습니다 만, 규칙이 true가 아닌 경우) – Natecat

+0

음 ... 언제 func (x) 대신에'x >> func'을 쓰고 싶습니까? 그리고 너 시도해 봤니? 생성 후 언제든지 클래스의 임의의 속성을 추가하거나 제거 할 수 있습니다 (또는 생성되기 전에 클래스 블록의 변수) –

답변

0

일반적으로 은 원시 코드에 정의 된 Python 유형 인 CPython에서 원숭이 패치를 적용하여 새로운 방법을 사용할 수 없습니다. 직접적인 메모리 액세스와 C 객체 구조의 변경으로 CPython을 사용하는 방법이 있습니다. "영리한", "아름답다"는 것은 아닙니다. (check https://github.com/clarete/forbiddenfruit)

즉, 자신 만의 패키지에 정의한 클래스 계층 구조의 경우, 설정 한 마술 "dunder"메소드가 모든 프로세스에서 해당 클래스의 모든 객체에 대한 동작을 변경합니다.

그래서, 당신은 파이썬의 "INT"를 할 수 없어 -하지만 당신은

class MyInt(int): 
    pass 

a = MyInt(10) 

MyInt.__rshift__ = lambda self, other: MyInt(str(self) + str(other)) 

print(a >> 20) 

가 인쇄되는 1020가 발생합니다 수 있습니다. 언어에서 사용하는 taht를에 대한 모든 마법 방법을 알려줍니다 thta

파이썬 문서는 데이터 모델입니다 :

https://docs.python.org/3/reference/datamodel.html