在python中。当我写x = 5
时,x
会自动成为int
的实例。但是假设我已经定义了一个新的课程number
,我希望x
成为number
的实例而不是int
,当我为其分配值5
时。这可能吗?
ie,而不是这个 - >
>>> x = 5
>>> type(x)
<type 'int'>
这可能吗:
>>> x = 5
>>> type(x)
<type 'number'>
答案 0 :(得分:5)
没有。你必须写一个猴子补丁才能达到这个目标,这是令人难以置信的单声道,你能不能写出来
x = number(5)
:)
答案 1 :(得分:4)
请注意,你真的不应该这样做。雅各布有正确的答案,即使用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
都是只读属性,因此我们必须创建具有更改值的新代码和函数对象。
有一点需要注意,这些值假定为常量,因此不会为每次调用函数创建新实例。如果改变该值,则该新值将反映在该函数的每次后续调用中。
答案 2 :(得分:1)
您必须利用Python's language services编译语句,然后根据需要使用AST替换对象。
答案 3 :(得分:1)
事实上,5
是int
的一个实例,x
只是指向它。 Python中的所有变量都是对象的引用。因此,当您编写type(x)
时,您会获得x
包含对的引用的对象类型,在这种情况下它是int
。
如果您为x
分配另一个值,例如x = "string"
,x
将保留对该字符串对象的引用,type(x)
将返回<type 'str'>
。