我不这么认为,但我想我会问以防万一.例如,要在封装int的类中使用:
i = IntContainer(3)
i + 5
Run Code Online (Sandbox Code Playgroud)
我不只是对这个int示例感兴趣,我一直在寻找干净和通用的东西,而不是覆盖每个int和string方法.
谢谢,孙强.这就是我想要的.我没有意识到你可以继承这些不可变类型(来自C++).
class IntContainer(int):
def __init__(self,i):
#do stuff here
self.f = 4
def MultiplyBy4(self):
#some member function
self *= self.f
return self
print 3+IntContainer(3).MultiplyBy4()
Run Code Online (Sandbox Code Playgroud)
ars*_*ars 11
这应该做你需要的:
class IntContainer(object):
def __init__(self, x):
self.x = x
def __add__(self, other):
# do some type checking on other
return self.x + other
def __radd__(self, other):
# do some type checking on other
return self.x + other
Run Code Online (Sandbox Code Playgroud)
输出:
In [6]: IntContainer(3) + 6
Out[6]: 9
In [7]: 6 + IntContainer(3)
Out[7]: 9
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请在以下文档中搜索"radd":
你会找到其他这样的方法来"正确添加","右减"等.
这是覆盖相同运营商的另一个链接:
顺便说一句,Python确实有铸造运算符:
但是,它们无法在您的示例中完成您所需的内容(基本上因为方法没有任何类型的参数注释,因此没有好的方法可以隐式转换).所以你可以这样做:
class IntContainer2(object):
def __init__(self, x):
self.x = x
def __int__(self):
return self.x
ic = IntContainer2(3)
print int(ic) + 6
print 6 + int(ic)
Run Code Online (Sandbox Code Playgroud)
但这会失败:
print ic + 6 # error: no implicit coercion
Run Code Online (Sandbox Code Playgroud)
你不会像 C++ 那样得到转换运算符,因为 Python 没有这种强静态类型系统。唯一的自动转换运算符是那些处理默认数值(int/float)的运算符;它们是在语言中预定义的,无法更改。
类型“转换”通常由构造函数/工厂完成。然后,您可以重载标准方法__add__,使其更像其他类一样工作。
有时也许直接从 int 子类就足够了。然后__add__就__radd__不需要盛装了。
class IntContainer(int):
pass
i = IntContainer(3)
print i + 5 # 8
print 4 + i # 7
class StrContainer(str):
pass
s = StrContainer(3)
print s + '5' # 35
print '4' + s # 43
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5953 次 |
| 最近记录: |