在python中模拟int

在python中模拟int,python,reference,int,built-in,Python,Reference,Int,Built In,我想定义一个对象,它的行为与int完全相同,只是有一些细微的差别。考虑类< /P> class MyInt: def __init__(self, num): self.num = num 我需要启用以下行为:当MyInt被分配给另一个变量时,操作结果是分配MyInt.num,而不是整个类,即 i = MyInt(10) a = i print(type(a)) # <class 'int'> print(a) # 10 i=MyInt(10) a=i 印

我想定义一个对象,它的行为与int完全相同,只是有一些细微的差别。考虑类< /P>
class MyInt:
  def __init__(self, num):
    self.num = num
我需要启用以下行为:当
MyInt
被分配给另一个变量时,操作结果是分配
MyInt.num
,而不是整个类,即

i = MyInt(10)
a = i
print(type(a)) # <class 'int'>
print(a)       # 10
i=MyInt(10)
a=i
印刷品(a类)
印刷品(a)#10
换句话说,
a=i
导致
a=i.num
MyInt
的所有其他功能应与
int
完全相同,并应用于
MyInt.num
,例如
i+=1
应等同于
i.num+=1

我想这可以通过使
MyInt
int
继承并使用
\uuu getattr\uuuuuu
\uuu setattr\uuuuu
来实现。但是,我不确定使用什么方法来获取python中变量的值,以便实现所需的功能


免责声明:我需要它,以便我可以在函数中全局修改变量。我知道不建议这样做,但这是我唯一的选择。而且我不能使用
全局

你不能这样做。Python中没有允许您调整赋值的挂钩

绑定对象的方法有很多种,
i=MyInt(10)
a=i
之间对于Python来说根本没有区别。这两种赋值都是首先执行右侧表达式的结果,然后在特定名称下存储对结果的引用。由于
i
生成了对已由
MyInt(10)
生成的同一对象的引用,因此您最终得到了对单个实例的两个具有不同名称的引用

但是
[i]
还存储一个引用,现在是在列表对象中。(i,i)中的target_name的
也是如此:
(3个引用,首先在一个包含两个引用的元组中,然后
target_name
,当循环执行时,它会像这样绑定两次,并且没有任何东西提前退出循环)。我至少用Python计算

在大多数情况下,您可以使
MyInt
像整数一样工作;有很多方法可以让你做到这一点。甚至还有一种方法可以作为起点。这些方法为您提供了一些预先实现的特殊方法,但是您仍然需要实现一些抽象方法,但是:

>>> 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__']
因为任何没有被实例化的子类都不能被实例化,所以这些子类可以立即反馈您是否遗漏了这些方法

已经提供的方法包括:

>>> 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']

你真的想提供一个合适的解决方案。

你不能这样做。Python中没有可以调整赋值的钩子,我不确定这是否可行。用法代码中的a=i.num有什么问题?此外,您还可以让
a
保持
MyInt
并调整打印等。这样,使用该类的代码就看不到它。此外,在许多情况下,如果您需要该语言未实现的功能,您的想法是错误的。您可能需要添加实际用例(为什么需要这样一个类?),以便这里的人可以提出实际可行的建议。谢谢您的帮助。实际用例将
i.num
存储在
np.uint8
类型的numpy数组中。既然似乎没有办法调整赋值,那么有没有可能使用我将
MyInt
的cast方法重载到
np.uint8