是否可以在 Python 中定义一个类似整数的对象,它也可以存储实例变量?

Is it possible to define an integer-like object in Python that can also store instance variables?

是否可以在 python 中定义一个数据对象,它在数学运算或比较中使用时表现得像一个普通整数,但也能够存储实例变量?

换句话说,应该可以做以下事情:

pseudo_integer = PseudoInteger(5, hidden_object="Hello World!")
print(5 + pseudo_integer) # Prints "10"
print(pseudo_integer == 5) # Prints "True"
print(pseudo_integer.hidden_object) # Prints "Hello World!"

考虑为您的 PseudoInteger class

实施 __add__ and __eq__ 方法

为此您只需要 class:

class PseudoInteger(object):
    def __init__(self, num, hidden=None):
        self.num = num
        self.hidden = hidden

    def __add__(self,  otherVal):
        if isinstance(otherVal, PseudoInteger):
            return self.num + otherVal.num
        else:
            return self.num + otherVal

p = PseudoInteger(4, 'Tiger')
q = PseudoInteger(6, 'lion')

print (p+q)
print (p+4)

打印出来:

10
8

您必须自己将需要的其他运算(除法、减法、eq 等)添加到 class:)

是的,是的。您可以创建自己的自定义 class。 Python 有很多神奇的方法可以帮助您存档。

查看代码:

class PseudoInteger:
    def __init__(self, x, s):
        self.x = x
        self.s = s

    def __add__(self, num):
        return self.x + num

    def __eq__(self, num):
        return self.x == num


a = PseudoInteger(5, 'hello, world')
print(a + 3)
print(a == 5)
print(a == 2)

或者你也可以直接继承int,创建实例后,你可以给继承的int对象赋属性。不能直接给int赋值,因为int不支持item赋值:

class PseudoInteger(int):
    pass

a = PseudoInteger(5)
a.hidden = 'hello, world'

print(a)
print(a == 5)
print(a + 3)
print(a.hidden)

所以,以上所有答案都很好,但您可能不想重新定义所有现有方法。

通常,在 python 中,您可以直接 class 任何内置的 class(类型)。但是对于不可变类型(python 中的整数是不可变的)有点棘手。长话短说:

class PseudoInt(int):
    def __new__(cls, x, hidden, *args, **kwargs):
        instance = int.__new__(cls, x, *args, **kwargs)
        instance.hidden = hidden
        return instance

x = PseudoInt(5, 'secret')
x.hidden  # 'secret'
x + 4  # 9
x * 3  # 15

通常,您应该重新加载 __init__ 方法,但对于不可变基数,您应该使用 __new__。您可以在 corresponding docs section

中阅读有关数据模型的更多信息

只有当您需要单一签名来构造您的对象时,所有这一切才可行。如果可以调用 1 次创建调用,以及使用属性填充对象的专用调用 - 就是您所需要的