Java与Python的一些区别
1.py是1991年问世,java是1995年问世;
2.hello world代码区别:
java:
public class Hello
{
public static void main (String[] args)
{
System.out.println("Hello World!");
}
}
py:
print("Hello World!")
3.打开文件代码:
py:
f = open("c:\\tmp\\Hello.java","r")
print(f.read())
f.close()
java有IO 模块设计,可是人们不太常用;
4.函数缺省值:
py:
class Employee():
def __init__(self, name , gender="male" , maritalStatus="single" ):
self.name = name
self.gender = gender
self.maritalStatus = maritalStatus
self和java里的this差不多,而self必须作为参数,py代码缩进用的空格,容易出错;
5.变量类型:
py:是动态语言,变量类型统一用var表示
var = 3
var = "hello world"
java:是静态语言, 变量类型有区别;
6. 实现Duck Typing代码:
py:
class Duck:
def help(self):
print( "Quaaaaaack! ")
class Person:
def help(self):
print( "help me!" )
def in_the_forest(x):
x.help()
in_the_forest(Duck())
in_the_forest(Person())
优点: 这个Duck和Person并没有实现共同的接口或者继承相同的类,但是照样可以作为参数传递给in_the_forest函数,这个特性写起代码来非常爽快。
缺点:1)写起来很爽,读起来就不爽了,别人看到了in_the_forest这个函数,他知道参数x的类型是什么吗?是Person? 是Bird? 还是别的类?
2) 如果重构一下Person函数的help方法,比如改成sos(self),py的IDE能安全地重构吗?恐怕是不容易吧? 假设人肉重构改错了,py也只能在运行时发现错误了!
java:
由于自己是静态类型,变量类型在编译期就能确定,IDE那强大的智能感知功能,自动安全重构的功能一直是引以为傲的卖点。
7.AOP:是对现有代码做增强,动态的添加一些安全、日志、事物等‘切面’功能。
java:
java类一旦被装载就无法修改,那是怎么实现动态添加的呢?
答:我们可以在运行时生成新的类啊,让新生成的类继承老的类,或者和老的类实现同样的接口,比如ASM这样的工具,可以操作字节码去创建新的类,织入那些‘切面’代码,这种工作如此精巧,让人叹为观止。
py:
我们是动态语言,可以在运行时对一个类进行增强:添加方法,替换方法,根本不用操作那么Low的字节码,我给你举个简单的例子:
class Order:
def save(self):
print ("save order")
#把老的方法引用保存起来
old_save=Order.save
#定义一个新方法,该新方法调用老方法
#并在方法前后加上了日志
def save_with_logging(self):
print ("logging start")
old_save(self)
print ("logging end")
#把新方法赋值给Order类的save方法
Order.save=save_with_logging
#测试
t=Order()
t.save()
输出:
logging start
save order
logging end
Python想实现AOP,还可以使用装饰器,Meta class等很多方式,总得来说py的函数就是一个对象;