是否可以在 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 次创建调用,以及使用属性填充对象的专用调用 - 就是您所需要的
是否可以在 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
为此您只需要 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 次创建调用,以及使用属性填充对象的专用调用 -