打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Java、Python、Go编程思想的不同

Java、Python、Go编程思想的不同

看了两周七牛团队翻译的《Go语言程序设计》,基本上领略到了Go语言的魅力。学习一个语言,语法什么的任何人都是很容易学会,难就难在充分领略到这门编程语言的思想。

面向对象

喂!屌丝码农该找个对象了。

除去Java Python Go这三种语言底层以及语法的不同,这里以个人的理解只说说其面向对象方面的思想。 一个简单的示例:

描述人,李雷,韩梅梅,他俩都是好学生。

将用 java python go 这三种语言分别简单的描述。


Java 思想

人,是抽象的概念,可以洗衣做饭的灵长目物种,没法特指一样具体的东西,但它也有一些如性别、撒尿这类的属性和功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/**
 * 抽象出来的人
 */
abstract class Human {
    protected String sex;
    protected String name;
    public void setSex(String sex) {
        this.sex = sex;
    }
    public String getSex() {
        return this.sex;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return this.name;
    }
    abstract void doPee(); // 抽象的方法
}

这里使用抽象类,是因为名字都是父母起的,但撒尿的方法男女不同。接下来是具象人这个抽象的概念了。这里就固话性别属性并且具体定义撒尿的方式。

/** * 具象的男性 */ class Male extends Human { public Male() { this.sex = “男”; }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    /**
     * 实现的方法
     */
    public void doPee() {
        System.out.println(this.name + " " this.sex + "站着撒尿.");
    }
}
/**
 * 具象的女性
 */
class Female extends Human {
    public Female() {
        this.sex = "女";
    }
    /**
     * 实现的方法
     */
    public void doPee() {
        System.out.println(this.name + " " this.sex + "蹲着撒尿.");
    }
}

现在有男人和女人了,然后李磊和韩梅梅就要来折磨我们了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Male lilei = new Male();
lilei.setName("李磊");
System.out.println(lilei.getName() + " " + lilei.getSex() + " " "出场");
Female hanmeimei = new Female();
hanmeimei.setName("韩梅梅");
System.out.println(hanmeimei.getName() + " " + hanmeimei.getSex() + " " "出场");
lilei.doPee();
hanmeimei.doPee();
_________________________________________________
output: 李磊 男 出场
output: 韩梅梅 女 出场
output: 李磊 男站着撒尿.
output: 韩梅梅 女蹲着撒尿.

李磊和韩梅梅都是好学生,我们这里定义学习的接口,这里的接口就是,大家必须得死学傻学,怎么学看你自己。

1
2
3
4
5
6
/**
 * 学习接口
 */
interface Study {
    public abstract void learningEnglish();
}

上面是教育部规定的,李磊韩梅梅作为学生必须得学,男人女人都得经历的。来实现学习接口。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
class Male extends Human implements Study {
    ......
    ......
    /**
     * 实现的接口
     */
    public void learningEnglish() {
        System.out.println(this.name + ": How are you?");
    }
}
/**
 * 具象的女性
 */
class Female extends Human implements Study {
    ......
    ......
    /**
     * 实现的接口
     */
    public void learningEnglish() {
        System.out.println(this.name + ": I'm fine, thank you!");
    }
}
......
......
lilei.doPee();
hanmeimei.doPee();
lilei.learningEnglish();
hanmeimei.learningEnglish();
_________________________________________________
output: 李磊: How are you?
output: 韩梅梅: I'm fine, thank you!

java的思想大致就是这么样。很严谨,就像一个老学究,1就是1,2就是2。

这是所有的java代码

Main.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
public class Main {
    public static void main(String[] args) {
        Male lilei = new Male();
        lilei.setName("李磊");
        System.out.println(lilei.getName() + " " + lilei.getSex() + " " "出场");
        Female hanmeimei = new Female();
        hanmeimei.setName("韩梅梅");
        System.out.println(hanmeimei.getName() + " " + hanmeimei.getSex() + " " "出场");
        lilei.doPee();
        hanmeimei.doPee();
        lilei.learningEnglish();
        hanmeimei.learningEnglish();
    }
}
/**
 * 抽象出来的人
 */
abstract class Human {
    protected String sex;
    protected String name;
    public void setSex(String sex) {
        this.sex = sex;
    }
    public String getSex() {
        return this.sex;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return this.name;
    }
    abstract void doPee(); // 抽象的方法
}
/**
 * 学习接口
 */
interface Study {
    public abstract void learningEnglish();
}
/**
 * 具象的男性
 */
class Male extends Human implements Study {
    public Male() {
        this.sex = "男";
    }
    /**
     * 实现的方法
     */
    public void doPee() {
        System.out.println(this.name + " " this.sex + "站着撒尿.");
    }
    /**
     * 实现的接口
     */
    public void learningEnglish() {
        System.out.println(this.name + ": How are you?");
    }
}
/**
 * 具象的女性
 */
class Female extends Human implements Study {
    public Female() {
        this.sex = "女";
    }
    /**
     * 实现的方法
     */
    public void doPee() {
        System.out.println(this.name + " " this.sex + "蹲着撒尿.");
    }
    /**
     * 实现的接口
     */
    public void learningEnglish() {
        System.out.println(this.name + ": I'm fine, thank you!");
    }
}

Python 思想

python无以言状的灵活,你就是上帝!

这里我们只要创建一个根类,其他的东西,随时随地,想加就加。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Human:
"""
"""
def __init__(self):
    self.__name = ""
    self.__sex = ""
def setName(self, name):
    self.__name = name
def getName(self):
    return self.__name
def setSex(self, sex):
    self.__sex = sex
def getSex(self):
    return self.__sex
name = property(getName, setName) # 就像java中的POJO setter以及getter
sex = property(getSex, setSex) # 就像java中的POJO setter以及getter

下面就边执行边丰满它

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
lilei = Human()
lilei.sex = "男"
lilei.name = "李磊"
print "%s %s 出场" % (lilei.name, lilei.sex)
hanmeimei = Human()
hanmeimei.sex = "女"
hanmeimei.name = "韩梅梅"
print "%s %s 出场" % (hanmeimei.name, hanmeimei.sex)
# Pee的方法
def doPee(self, how):
print "%s %s %s撒尿" % (self.name, self.sex, how)
Human.doPee = doPee #动态绑定方法
lilei.doPee("站着")
hanmeimei.doPee("蹲着")
# 学习的方法
def doLearning(self, learn):
print "%s: %s" % (self.name, learn)
Human.doLearning = doLearning #动态绑定方法
lilei.doLearning("How are you?")
lilei.doLearning("I'm fine, thank you!")
_________________________________________________
output: 李磊 男 出场
output: 李磊韩梅梅 女 出场
output: 李磊 男 站着撒尿
output: 韩梅梅 女 蹲着撒尿
output: 李磊: How are you?
output: 李磊: I'm fine, thank you!

python中一切对象都是鸭子类型,何谓鸭子类型?只要会”嘎嘎”叫的东西都是鸭子。应用到上面场景中,只要具有学习和 撒尿方法的对象都可以看作人了。从另一方面说,我对于鸭子只关注它是否能够”嘎嘎”叫,如果能,不管是什么东西,那么它就是一只鸭子; 对于人,只关注他们是否能撒尿与学习,既能撒尿又能学习,他凭什么就不是人?

python和java就好像阴阳之替的东方玄学之余西方哲学。

这是所有的python代码

test.py:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#!/usr/bin/env python
# -*- coding: utf-8 -*-
class Human:
"""
"""
def __init__(self):
    self.__name = ""
    self.__sex = ""
def setName(self, name):
    self.__name = name
def getName(self):
    return self.__name
def setSex(self, sex):
    self.__sex = sex
def getSex(self):
    return self.__sex
name = property(getName, setName) # 就像java中的POJO
sex = property(getSex, setSex) # 就像java中的POJO
if __name__ == '__main__':
lilei = Human()
lilei.sex = "男"
lilei.name = "李磊"
print "%s %s 出场" % (lilei.name, lilei.sex)
hanmeimei = Human()
hanmeimei.sex = "女"
hanmeimei.name = "韩梅梅"
print "%s %s 出场" % (hanmeimei.name, hanmeimei.sex)
# Pee的方法
def doPee(self, how):
    print "%s %s %s撒尿" % (self.name, self.sex, how)
Human.doPee = doPee #动态绑定方法
lilei.doPee("站着")
hanmeimei.doPee("蹲着")
# 学习的方法
def doLearning(self, learn):
    print "%s: %s" % (self.name, learn)
Human.doLearning = doLearning #动态绑定方法
lilei.doLearning("How are you?")
lilei.doLearning("I'm fine, thank you!")

Go 思想

面向对象之于Go,没有继承这么一说,更像是C与Python的结合体,并把鸭子类型发扬到极致。

接口(interface)就好比是一只”鸭子”,而interface结构体内包裹的方法就是这只”鸭子”所具有的功能,Go中,接口可以描述为: 具有这些功能的家伙就是这只”鸭子”

方法(func)被定义在结构(类/struct)之外,被绑定于这个结构之上,可以描述为: 这是它的功能 ,当一个struct中的一些方法都包含在某个interface中时,我们就说: 啊哈,这就是那只”鸭子”,哪怕它多长了几条腿(func),它也是啊

关于继承,没有,go中虽然内嵌很像继承但不是。继承是一脉相传,而go的内嵌表达出你中有我我中有你的情怀,需要用到某个struct的功能了,那么就对它说 你就是我的一部分

struct、interface、func 这些几乎就是Go面向对象的全部了,如此简洁。

package main

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import (
    "fmt"
)
// 接口 学生
type Student interface {
    learningEnglish(string)
}
// 结构
type Human struct {
    Name string
    Sex  string
}
// 学习英语方法,绑定于Human
func (student Human) learningEnglish(learning string) {
    fmt.Printf("%s: %s\n", student.Name, learning)
}
// 结构 男人
// go没有继承这个概念,这里是嵌入
type Male struct {
    Human "嵌入字段"
}
type Female Male
// 方法, 绑定到了Human结构
func (this Human) Pee(how string) {
    fmt.Printf("%s %s %s撒尿\n", this.Name, this.Sex, how)
}
// 学习
func doLearning(learning Student, learing string) {
    learning.learningEnglish(learing)
}
// Pee
func doPee(human interface {}) {
    switch sex := human.(type){
    case Male:
        sex.Pee("站着")
    case Female:
        sex.Pee("蹲着")
    }
}
func main() {
    lilei := Male{}
    lilei.Name = "李雷"
    lilei.Sex = "男"
    fmt.Printf("%s %s 出场\n", lilei.Name, lilei.Sex)
    hanmeimei := Female{}
    hanmeimei.Name = "韩梅梅"
    hanmeimei.Sex = "女"
    fmt.Printf("%s %s 出场\n", hanmeimei.Name, hanmeimei.Sex)
    doPee(lilei)
    doPee(hanmeimei)
    doLearning(lilei, "How are you?")
    doLearning(hanmeimei, "I'm fine, thank you!")
}

摆脱C++/Java/Python等思想的桎梏,才能领略Go的魅力

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
lilei和hanmeimei的欲望人生(文图结合) [50P]
李雷和韩梅梅的欲望人生
一首“李雷和韩梅梅之歌”唱哭80后
温州作业本封面女神结婚 引发无数80后怀旧潮
LiLei和HanMeimei已经结婚了
Python装饰器
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服