2011-02-16 6 views
1

파이썬. x = 5이라고 쓰면 xint의 인스턴스가됩니다. 그러나 새로운 클래스를 정의했다고 가정하면 값을 할당하면 int 대신에 numberxnumber의 인스턴스가되고 싶습니다. 이것이 가능한가? 이 대신에, 즉파이썬 자동 클래스 할당

->

>>> x = 5 
>>> type(x) 
<type 'int'> 

이 가능 :

>>> x = 5 
>>> type(x) 
<type 'number'> 
+0

아니요. 수행 할 수 없습니다. 중요한 질문은 "왜 이걸하고 싶니?" 그리고 "당신의 ** 진짜 ** 문제는 무엇입니까?" 너 뭐하려고? 어떤 문제가 있습니까? 이것이 어떻게이 문제에 대한 해결책이 될 수 있을까요? 이에 대한 배경을 제공하십시오. –

답변

4

정말 이런 식으로해서는 안됩니다. Jakob은 올바른 대답을 가지고 있습니다 (예 : x = number(5)).

그러나, 말했다, 나는 그것이 이론적으로 할 수있는 방법을 원했고, 여기에 장식의 형태로 하나 개의 솔루션입니다 :

import types 

class number(object): 
    def __init__(self, value): 
     self.value = value 

def replace_int(x): 
    if isinstance(x, int): 
     return number(x) 
    else: 
     return x 

def custom_numbers(f): 
    code = f.func_code 
    consts = tuple(map(replace_int, code.co_consts)) 
    new_code = types.CodeType(code.co_argcount, code.co_nlocals, 
           code.co_stacksize, code.co_flags, 
           code.co_code, consts, code.co_names, 
           code.co_varnames, code.co_filename, 
           code.co_name, code.co_firstlineno, 
           code.co_lnotab) 
    return types.FunctionType(new_code, f.func_globals, f.func_name)

당신이 장식 모든 기능, 사용자 정의를 사용하여 종료됩니다 숫자 클래스 :

@custom_numbers 
def test(): 
    x = 5 
    print type(x) 


>>> test() 
<class '__main__.number'> 

데코레이터는 함수의 코드 객체의 정수 상수를 사용자 정의 클래스의 인스턴스로 대체하여 작동합니다. 그러나 function.co_codecode.co_consts은 모두 읽기 전용 속성이므로 변경된 값으로 새 코드 및 함수 객체를 만들어야합니다.

한 가지주의 할 점은 값이 상수로 간주되므로 함수를 호출 할 때마다 새 인스턴스가 만들어지지 않는다는 것입니다. 값을 변경하면 그 이후의 각 함수 호출에 새 값이 반영됩니다.

+0

재미 있지만 다소 이상합니다. –

5

번호 당신은 이것을 달성하기 위해 원숭이 패치를 작성해야, 즉 할 수있는, 믿을 수 없을만큼 unpythonic입니다 당신은 단순히 쓸

x = number(5) 

:

+0

'x = number (5)'를 쓰면 간단히 달성 할 수 있지만, 프로그램 요구 사항은 이전의 것을 원한다는 것이 사실입니다. 어쨌든, 원숭이 패치를 간단하게 만들거나 사용하고 있습니까? –

+0

기본적으로 파이썬의 백엔드를 다시 작성해야합니다. ^^ –

1

Python's language services을 사용하여 문을 컴파일 한 다음 적절하게 개체를 대체하는 AST를 수행해야합니다.

1

실제로 5int의 인스턴스이고, x은이 인터페이스를 가리키고 있습니다. 파이썬의 모든 변수는 객체에 대한 참조입니다. 따라서 type(x)을 쓸 때 x에 대한 참조가있는 객체 유형을 얻습니다.이 경우는 int입니다.

당신이 x에 다른 값을 지정하면

x는 해당 문자열 개체에 대한 참조를 개최하고, type(x)<type 'str'>를 반환합니다, x = "string" 말한다.

+1

예, 우리는 이미이 점의 상대성이 무엇인지 이미 알고 있습니다. –