在Python中,数据类型(如int,float)既代表值,又具有一些内置属性/函数/等:
In [1]: a = 1.2
In [2]: a
Out[2]: 1.2
In [3]: a.is_integer()
Out[3]: False
是否可以在Python中重现此行为,例如定义一个类:
class Scalar:
def __init__(self, value)
self.value = value
# other code ....
s = Scalar(1.2)
我可以s
返回1.2(而不是键入s.value
),并执行a = s
- >等操作a = 1.2
?我最接近这种行为的是添加类似:
def __getitem__(self, key=None):
return self.value
并使用a = s[()]
,但这看起来不太好。
答案 0 :(得分:4)
我可以返回1.2(而不是键入s.value)
在控制台中?然后实现__repr__
方法。
a = s - > a = 1.2
为避免使用a = s.value
,您可以实施__call__
并调用该对象:
>>> class Scalar:
... def __init__(self, value):
... self.value = value
... def __repr__(self):
... return str(self.value)
... def __call__(self):
... return self.value
...
>>> s = Scalar(1.2)
>>> s
1.2
>>> a = s()
>>> a
1.2
查看有关data model on emulating numeric types。
的文档例如:
class Scalar:
def __init__(self, value):
self.value = value
def __repr__(self):
return str(self.value)
def __call__(self):
return self.value
def __add__(self, other):
return Scalar(self.value + other.value)
def __lt__(self, other):
return self.value < other.value
def ___le__(self, other):
return self.value <= other.value
def __eq__(self, other):
return self.value == other.value
def __ne__(self, other):
return self.value != other.value
def __gt__(self, other):
return self.value > other.value
def __ge__(self, other):
return self.value >= other.value
可以像这样使用:
>>> s1 = Scalar(1.2)
>>> s2 = Scalar(2.1)
>>> s1 + s2
3.3
>>> s1 < s2
True
>>> s1 > s2
False
>>> s1 != s2
True
>>> s1 <= s2
True
>>> s1 >= s2
False
还有__int__
和__float__
魔术方法,您可以像这样实现和使用(这在语义上更正确):
>>> a = int(s)
>>> a = float(s)
答案 1 :(得分:1)
据我所知,a = s
示例无法实现这一点。您必须更改赋值运算符=
的行为。赋值运算符对右边的对象没有任何作用,只是复制对它的引用(至少在对象的情况下)。
通常,可以使用operator overloading更改自定义类的内置运算符的行为,但Python不会为赋值(=
)提供此类选项,因为它与添加(+
)和甚至平等(==
)之类的运算符有多么不同。