파이썬. x = 5
이라고 쓰면 x
은 int
의 인스턴스가됩니다. 그러나 새로운 클래스를 정의했다고 가정하면 값을 할당하면 int
대신에 number
이 x
이 number
의 인스턴스가되고 싶습니다. 이것이 가능한가? 이 대신에, 즉파이썬 자동 클래스 할당
->
>>> x = 5
>>> type(x)
<type 'int'>
이 가능 :
>>> x = 5
>>> type(x)
<type 'number'>
파이썬. x = 5
이라고 쓰면 x
은 int
의 인스턴스가됩니다. 그러나 새로운 클래스를 정의했다고 가정하면 값을 할당하면 int
대신에 number
이 x
이 number
의 인스턴스가되고 싶습니다. 이것이 가능한가? 이 대신에, 즉파이썬 자동 클래스 할당
->
>>> x = 5
>>> type(x)
<type 'int'>
이 가능 :
>>> x = 5
>>> type(x)
<type 'number'>
정말 이런 식으로해서는 안됩니다. 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_code
과 code.co_consts
은 모두 읽기 전용 속성이므로 변경된 값으로 새 코드 및 함수 객체를 만들어야합니다.
한 가지주의 할 점은 값이 상수로 간주되므로 함수를 호출 할 때마다 새 인스턴스가 만들어지지 않는다는 것입니다. 값을 변경하면 그 이후의 각 함수 호출에 새 값이 반영됩니다.
재미 있지만 다소 이상합니다. –
번호 당신은 이것을 달성하기 위해 원숭이 패치를 작성해야, 즉 할 수있는, 믿을 수 없을만큼 unpythonic입니다 당신은 단순히 쓸
x = number(5)
:
'x = number (5)'를 쓰면 간단히 달성 할 수 있지만, 프로그램 요구 사항은 이전의 것을 원한다는 것이 사실입니다. 어쨌든, 원숭이 패치를 간단하게 만들거나 사용하고 있습니까? –
기본적으로 파이썬의 백엔드를 다시 작성해야합니다. ^^ –
Python's language services을 사용하여 문을 컴파일 한 다음 적절하게 개체를 대체하는 AST를 수행해야합니다.
실제로 5
은 int
의 인스턴스이고, x
은이 인터페이스를 가리키고 있습니다. 파이썬의 모든 변수는 객체에 대한 참조입니다. 따라서 type(x)
을 쓸 때 x
에에 대한 참조가있는 객체 유형을 얻습니다.이 경우는 int
입니다.
당신이 x
에 다른 값을 지정하면
x
는 해당 문자열 개체에 대한 참조를 개최하고,
type(x)
는
<type 'str'>
를 반환합니다,
x = "string"
말한다.
예, 우리는 이미이 점의 상대성이 무엇인지 이미 알고 있습니다. –
아니요. 수행 할 수 없습니다. 중요한 질문은 "왜 이걸하고 싶니?" 그리고 "당신의 ** 진짜 ** 문제는 무엇입니까?" 너 뭐하려고? 어떤 문제가 있습니까? 이것이 어떻게이 문제에 대한 해결책이 될 수 있을까요? 이에 대한 배경을 제공하십시오. –