当前位置: 首页 > 科技观察

Java帝国对Python的渗透能否成功?

时间:2023-03-13 15:49:46 科技观察

简介爪哇帝国已经建立了20多年。经过历代君王的努力,可谓地大物博,码农众多。可国王还是不满意,整天想着怎么继续扩张疆域,这一夜又召来几位重臣商议。IO大臣说道:“陛下,天下大势已初定,我们Java帝国已经占据了后端开发、大数据、Android开发等重要领域,再扩张可不容易!”“是的,前端被JavaScript占据了,我们很难渗透进去。”Thread部长补充道。国王点点头。这是一个很好的声明。JavaScript称霸前端,Flash消失,Applet消失。想到阿普莱特,国王心里一阵刺痛。当时,Java是靠着Applet引起了码农的注意,一炮而红。为什么后来不行了?“人工智能呢?”国王厉声问道。“陛下,人工智能底层全是C/C++的地盘,应用层被Python等霸占了。”JDBC部长回答。“云计算呢?”“好像是Go语言的领地。”“嘶——”国王觉得有点牙疼。IO大臣连忙分担君主的忧虑:“陛下,现在涿鹿有八位好汉,边境战乱连年,陛下不但保住了先祖的基业,还扩建了,百姓苦苦挣扎,而老臣有一计,说不定能收到奇效。”“艾情,告诉我!”“老臣认为,不战而屈服才是上策。英雄们,我们要输出我雄伟的爪哇帝国的文化和价值观。”“什么文化和价值观?”“首先要宣传静态语言的好处,比如编译时发现的错误,适合阅读和维护的代码,适合大规模的Teamwork,我想出了一个slogan,叫做‘Dynamic一时爽,重建火葬场!'”“嗯,这个口号不错!国王称道:“爱卿真是老练。”“但有些语言也是静态的。是啊!你是怎么推广的?”老冤家丝路大臣发难了。“陛下,您想想看,我们的宝物可不少,”IO大臣根本不理会线程大臣,继续念叨着:“比如IoC、AOP、反射、动态代理、泛型、注解、JDBC、JMS……还有我们引以为豪的JVM,那些国家可能没有这些东西,我们派传教士把这些东西灌输给他们的臣民,让他们体验到Java的好处,慢慢同化他们就可以了!到时候,他们的码农自然会加入我的Java帝国。”“陛下,绝对不是,不同的语言有不同的特点,我们的文化是别人无法接受的,只会引起众人的嘲笑。”线程大臣觉得IO大臣疯了,简直是胡说八道,还得祸害国家。“你可以试试看!”国王的牙痛消失了。“IO部长将全面负责此事。我们将在一年内看到效果。”,终于来到了Python的王国。IO部长在选人的时候有一个重要的原则:自己是Java的铁杆粉丝,最好是对其他语言完全不了解,以免污染自己的思想。这个吉森是最好的之一。吉森先是找了个地方安顿下来,然后四处游荡。他惊奇地发现类方法中的self满天飞,代码被强行缩进了。它与我的大Java不同,充满异国情调。前面是一个茶馆,人很多。Gisen走进去看看他是否可以尝试一下并推广Java文化。“小二,我观察了好久,你怎么不在这里讨论一下泛型?”季森把服务员从茶水店里拉了出来。“通用?那是什么?”小二不解。“你一定是老外吧,要么是C++的,要么是Java的,对吧?”不知什么时候,来了一位老人。“老头眼光真好,我确实是Java王国的,奇怪这里为什么没有泛型。据我所知,泛型可以在编译时进行类型检查,码农不需要它在编写代码时。”它对类型转换非常有用。”Gieson开始灌输Java的各种好处。Listfiles=newArrayList();Stringfile=files.get(0);//不需要做强制类型转换files.add(newFile(.....));//编译报错“Outsider,ourvariableinPython是如果不需要声明类型,就不会做编译期的类型检查,只有在运行时才会检查变量是什么类型,是否可以调用它的方法。你说,有什么用仿制药?”Gisen惊呆了,卧槽,IO部长怎么不告诉我,人家根本就没有这个需求啊!想想我的大Java,花那么多心思去实现泛型,没想到完全是Python在这里没用,还输出什么文化教什么!条件反射地,吉森觉得自己有点被IO大臣给坑了!不过,多年的经验只是让他有些心慌,他立马稳住心神,改主题:“先生。支持反射吗?”在Java王国里,人们经常使用反射来获取一个类的属性和方法,然后根据一个字符串的名字来调用一个类的方法。比如有一个url:/user?action=login系统根据约定解析,判断类为User,方法为login,则可以创建User对象,通过反射调用login方法publicclassUser{publicvoidlogin(...){...}}“哈哈哈,你这个陌生人,你知道为什么我们的Python是动态语言吗?不知道我们的Python反射功能比你们的JavaGo好在哪里!来来来,我给你看个例子。"classUser:deflogin(self):print("thisislogin")"现在我打印他所有的方法:"methods=[xforx,yinUser.__dict__.items()iftype(y)==FunctionType]print(methods)#Output['login']"接下来我通过反射调用登录方法。好久没写代码了,可能不严谨,只要看懂意思就可以了。"url="/user?action=login"#从url解析得到class和action,代码略clz="User"action="login"#根据name得到User对象和方法user=globals()[clz]()func=getattr(user,action)#获取登录方法func()#OutputThisislogin吉森看到这么几行代码,就实现了基本的反射,真灵活,这个Python真好,他是有点羡慕DynamicProxy不行,我肩负着IO大臣的重托,我是来布道的,不能让这个老头给我洗脑!Gieson想到了一个大杀器:dynamicproxy,这是一个非常Java的基础技术,可以在运行的同时实现类和方法的增强,比如在调用业务方法前后添加事务管理,日志管理等功能,没有动态代理,AOP无从谈起。Giessen说:“先生,Python是如何实现动态代理的?”老者微微一笑:“JavaClass有个缺点。一旦加载到Java虚拟机中,就无法修改。如果要增强,只能修改字节码,新建类,封装旧类。,是代理人。但是Python是一种动态语言,可以在运行时进行修改。比如我可以给User类动态添加一个新的属性,这在你的Java里做不到?”setattr(User,"name",'andy')print(user.name)#andyGisen惊呆了。这真是颠覆了他从小养成的世界观:一个类在运行时是不能改变的,更不可能增加任何属性。老头继续说:“看看User类和Proxy类。每次调用登录方法时,我都可以动态创建一个新方法。在这种新方法中,我可以做各种花样。“classUser:deflogin(self):print('userlogin')deflogout(self):print('userlogout')classProxy:def__init__(self,target):self.target=targetdef__getattribute__(self,name):target=object.__getattribute__(self,"target")attr=object.__getattribute__(target,name)ifname=='login':defnewFunc(*args,**kwargs):print("loginstart")result=attr(*args,**kwargs)print("loginend")returnresultreturnnewFuncelse:returnattru=User()p=Proxy(u)p.login()#实际调用动态创建的方法p.logout()#调用原方法"你的__getattribute__是什么代理?”看到神奇的地方来了,吉森忍不住问道。称呼。“哦,原来如此,你通过__getattribute__做了一些事情,如果名字是login,创建一个新的方法,除了在新方法中调用旧方法外,还输出log。”没错,小朋友可以被教了!”Gisen现在真的很佩服动态语言,在Java里面肯定是通过在运行时对字节码进行操作来增强的。字节码,那可不是一般人能玩的。这个Python其实是在源代码层面增强了它的功能!这是个好计划。吉森怀疑自己去蟒蛇王国的效果。记得走之前,IO部长给了我三个工具包,告诉自己只有在最关键的时候才打开。如果我现在不打开它们,我要等到什么时候?我摸了摸自己的胸口,发现只剩工具包了。二,丢了一个,我觉得这次要杀了我的脑袋,管不了那么多,吉森赶紧拿出一个,看到上面写着一段话:GIL(GlobalInterpretationLock),GIL是的命脉Python,这个锁超大锁只允许一个线程获得Python解释器的控制权。简单的说,同一时间只能运行一个线程!没想到,老者微微一笑:“Python确实有GIL,但是这个程序的瓶颈,不在CPU,而是IO,是用户输入,数据库查询,网络访问,线程等待IO操作的时候,给把GIL的超大锁上去,让其他线程去执行。再说了,你真要用多核的时候,可以用多进程!第一招轻松解决,季森连忙拿出第二招,上面写了几个字:“动力凉一会,火葬场重建。”“哈哈哈,”老者狡黠一笑:“这都是不明情况的外人的误会。你听说过Quora吗?哦,上不去是吧!这个Quora是写在Python,而且测试用例写的很好,结构不怕!所以关键是测试用例!”第二招再次被解决,季森彻底失控了。看到季森神色的变化,老者开始暴露身份:“老实说,老夫是蟒王的特使,我们的探子早就听说了你在爪哇的传教计划失败了。曾经你进入我们的国家,我就被盯上了,本王特地派我来,看看能不能说服你留在我们的国家。”吉森想了想,回去也干不了正事,于是点头同意。一年后,IO大臣开始盘点传教计划,发现回来传教的***,尤其是去蟒蛇王国的吉森,怎么一点消息都没有?又该送人了……【本文为专栏作家“刘欣”原创稿件,转载请通过作者微信获得授权公众号编码】点此查看作者更多好文