在python中模拟int

nik*_*iko 2 python int reference built-in

我想定义一个与int具有完全相同行为的对象,但有一些细微的差别.考虑上课

class MyInt:
  def __init__(self, num):
    self.num = num
Run Code Online (Sandbox Code Playgroud)

我需要启用以下行为:当MyInt分配给另一个变量时,操作会导致分配MyInt.num而不是整个类,即

i = MyInt(10)
a = i
print(type(a)) # <class 'int'>
print(a)       # 10
Run Code Online (Sandbox Code Playgroud)

换句话说,a=i结果a= i.num.所有其他功能MyIntint与应用完全相同MyInt.num,例如i += 1应相当于i.num +=1

我想这可以通过MyInt继承int和利用__getattr__和来实现__setattr__.但是,我不确定在python中使用什么方法来获取变量的值,以便我可以实现所需的功能.

免责声明:我需要这个,以便我可以在函数内全局修改变量.我知道这不推荐,但这是我唯一的选择.我也不能用global.

Mar*_*ers 5

你不能这样做.Python中没有可用于调整分配的钩子.

有任意数量的绑定的对象的方式,和对Python,没有任何区别,在所有的,之间i = MyInt(10)a = i.两者都是赋值,其中首先执行右侧表达式的结果,然后对结果的引用存储在特定名称下.由于i生成对已生成的同一对象的引用,因此MyInt(10)最终会将2个引用(具有不同的名称)引用到单个实例.

但是[i]也存储了一个引用,现在在一个列表对象中.那么for target_name in (i, i):(3个引用,首先在一个带有两个引用的元组中,然后target_name,当循环执行时没有像这样绑定两次,并且没有任何东西提前退出循环).我在Python 中至少计算了8种不同的绑定对象的方法.

可以MyInt像在大多数情况下一个整数工作; 有许多特殊方法可以模拟数字类型,让您完成此任务.甚至还有一个numbers.Integral抽象基类可以作为起点.这些为您提供了许多预先实现的特殊方法,但您仍然必须实现许多抽象方法,但是:

>>> from numbers import Integral
>>> sorted(Integral.__abstractmethods__)
['__abs__', '__add__', '__and__', '__ceil__', '__eq__', '__floor__', '__floordiv__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__neg__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rtruediv__', '__rxor__', '__truediv__', '__trunc__', '__xor__']
Run Code Online (Sandbox Code Playgroud)

由于任何不能实例化的子类,这些都会为您提供关于您是否错过任何这些方法的即时反馈.

已经提供的方法是:

>>> from numbers import Number
>>> sorted(n for n in dir(Integral) if n not in Integral.__abstractmethods__.union(dir(Number)))
['__bool__', '__complex__', '__divmod__', '__float__', '__index__', '__rdivmod__', '__rsub__', '__sub__', 'conjugate', 'denominator', 'imag', 'numerator', 'real']
Run Code Online (Sandbox Code Playgroud)

而你真的想提供一个合适的__hash__方法.