Python运算符
C以丰富的操作符而闻名。 C ++通过允许运算符重载将其扩展到极限。 Boost.Python利用了这一点,并且可以很容易地包装C ++运算符驱动的类。
考虑文件位置类FilePos和一组采用FilePos实例的运算符:
class FilePos { /*...*/ };
FilePos operator+(FilePos, int);
FilePos operator+(int, FilePos);
int operator-(FilePos, FilePos);
FilePos operator-(FilePos, int);
FilePos& operator+=(FilePos&, int);
FilePos& operator-=(FilePos&, int);
bool operator<(FilePos, FilePos);
可以相当简单直观地将类和各种运算符映射到Python:
class_<FilePos>("FilePos")
.def(self + int()) // __add__
.def(int() + self) // __radd__
.def(self - self) // __sub__
.def(self - int()) // __sub__
.def(self += int()) // __iadd__
.def(self -= other<int>())
.def(self < self); // __lt__
上面的代码片段非常清晰,几乎不需要任何解释。它几乎与运营商的签名相同。请注意,self指的是FilePos对象。也,
并非您在运算符表达式中可能需要与之交互的每个类都是(廉价地)默认可构造的。在编写“自我表达式”时,可以使用其他<T>()代替实际的T实例。
特殊方法
Python还有一些特殊方法。促进。
Python支持真正的Python类实例支持的所有标准特殊方法名称。一组类似的直观接口也可用于包装与这些Python特殊函数相对应的C ++函数。例:
class Rational
{ public: operator double() const; };
Rational pow(Rational, Rational);
Rational abs(Rational);
ostream& operator<<(ostream&,Rational);
class_<Rational>("Rational")
.def(float_(self)) // __float__
.def(pow(self, other<Rational>)) // __pow__
.def(abs(self)) // __abs__
.def(str(self)) // __str__
;