Go学习笔记 - 关于Java、Python、Go编程思想的不同 - 黑暗伯爵

python

Go学习笔记 - 关于Java、Python、Go编程思想的不同

Go语言与java python的不同之处

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

## 面向对象

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

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

一个简单的示例:

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

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

----------

### Java 思想

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

/**

* 抽象出来的人

*/

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 = "男";

}

/**

* 实现的方法

*/

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 + "蹲着撒尿.");

}

}

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

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: 韩梅梅 女蹲着撒尿.

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

/**

* 学习接口

*/

interface Study {

public abstract void learningEnglish();

}

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

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

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无以言状的灵活,你就是上帝!

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

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

下面就边执行边丰满它

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:

#!/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

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的魅力

---------------------------------

以上是 Go学习笔记 - 关于Java、Python、Go编程思想的不同 - 黑暗伯爵 的全部内容, 来源链接: utcz.com/z/386525.html

回到顶部