首先我们要观察C++中的cout,下面语句会在控制台打印出"haha我是C++"并换行
cout << 'haha' << '我是C++' << endl;
我们首先需要观察cout语句的形式,cout作为起始,要传入输出流的内容用<<连接在cout的右边,并且可以实现连续的输出,最后的endl可以实现换行
首先我们需要思考我们要怎么做,很显然,<<是运算符,叫做左移运算符,因此我们完全可以创建一个重载了<<运算符的类来实现我们要的特性
class Cout:
def __lshift__(self, other):
print(other, end='')
cout = Cout()
cout << 'haha'
至此,已经可以打印出haha了,注意把print的end设置为空字符,因为print默认换行,这是和cout不一样的行为,接下来我们要思考如何连串的打印呢?
首先我们要清楚一个表达式在执行完之后会发生什么,在python中,表达式执行完后会返回一个值,我们现在lshift没有return,当然在python中就意味着返回了None,None很显然不会执行<<运算符,其实到这里读者肯定能想到要怎么做了
class Cout:
def __lshift__(self, other):
print(other, end='')
return self
cout = Cout()
cout << 'haha' << '我是Python'
我们只需要在lshift中返回实例对象本身,也就是self,根据lshift的执行顺序是从左到右的特点,就可以正确打印了,endl其实没啥困难,无非是在lshift里面判断一下类型
class Cout:
def __lshift__(self, other):
if isinstance(other, Endl):
print()
else:
print(other, end='')
return self
class Endl:
pass
cout = Cout()
endl = Endl()
cout << 'haha' << '我是Python' << endl
至此,我们就实现了C++中的cout了!!!