计算机编程语言的特性汇总

作者: 李佶澳   转载保留:原文地址   更新时间:2017/10/28 12:35:10

说明

记录在了解编程语言时遇到一些特性。这里只关心那些可能影响到软件架构、开发模式的特性。常规语法、语法糖等不在此列。

Decorator in Python

面向对象中的概念。

语法:

在类中定义:
static returntype  fucnname (arguments)
{
	...
}

规则:

静态方法只能访问类的静态成员

非静态方法可以访问类的静态成员

静态方法可以用实例调用,也可以用类名调用

Reflection in Golang

http://blog.golang.org/laws-of-reflection

Reflection(反射), 在上面连接中做了非常详细准确的说明。

在Golang中, Interface(接口)也是一种类型, 一个变量的类型(MyInt)如果满足了一种接口类型(Reader)的要求,那么这个变量(m)就可以被赋值给接口变量(r), 反射操作的对象是接口变量(r)

通过反射可以: 从r中获得m的相关信息(Type and Value)、修改m的值

type Reader interface{
	Read(p []byte)(n int, err error)
}

type MyInt int

func (v MyInt) Read(p []byte)(n int, err error){
	...
}

var r io.Reader
var m MyInt

r = m

在软件设计或编程过程中,假设我们定义了一个参数是接口类型(Reader)的函数,那么所有满足这个接口类型的变量(m)都可以传递给这个函数。按照我个人理解,通常情况下,这样实现的时候应该意味着在函数内部我们只能够使用接口类型(Reader)中定义的成员(Read)。reflection则提供了更多的选择,使得我们可以在函数内部获得接口类型以外的内容(例如MyInt的成员).

如果用C语言来模拟,应该是如下情形:

Struct A{
	int a;
	int b;
};

struct A a;

void func(void *p){                 //在golang中传入的是接口, C中以空指针代替
	...
	struct A *pa = (struct A *)p;   //在golang中用reflection获得Struct A的其它成员信息, C中通过类型转换实现
	...
}

特别注意: 有一个特别需要注意的地方,上面的C语言的模拟中,是在事先知道Struct A类型的情况下进行的。golang中则是通过把类型信息存放在接口变量中的方式,得知p与Struct A的关联的。

golang的反射应当主要就是这个用途。(一直折腾浅显的C开发, 没有接触到过这种应用场景, 在开发技术方面落伍很多啊… 2014/06/27)

Closure

Decorator in Python

在tornado中看到python中@的用法,摸不着头脑,查了下@的来源。

最早在python2.4中引入了Decorator语法.

PEP 318: Decorators for Functions and Methods

python2.4中引入了@staticmethod和@classmethod用更清晰的方式(Decorator)声明静态成员和类成员

语法糖

编程中的一些通用或者常规的用法,被一些编程语言吸收成为新的语法, 这样的语法可以称作是语法糖。语法糖可以减少编程过程中的体力劳动, 但是语言学习过程中需要学习的内容也相应增加。

with – in Python

https://docs.python.org/3/reference/compound_stmts.html#the-with-statement

使用with时,with的作用对象必须是实现了属性__enter__(self)__exit__(self, exc_type, exc_value, traceback)

示例:

class Sample:
	def __init__(self,name):
		self.name=name;
	def __enter__(self):
		print("__enter__")
		return self
	def __exit__(self, type, value, trace):
		print("__exit__")

with Sample("hahah") as s:
	print("sample name%s", s.name)

执行步骤:

1 类Sample的__init__函数被执行, 构建了对象
2 对象的__enter__函数被执行, 返回的值被赋予了"with XXX as s"中的s
3 with下的语句块被执行
4 对象的__exit__函数被执行  //__exit__函数用来处理with下语句块执行时抛出的异常

__enter__与__exit__的详细说明

本文原创首发于网站:www.lijiaocn.com

QQ交流群

区块链实践互助QQ群:576555864

Kubernetes实践互助QQ群:947371129

Prometheus实践互助QQ群:952461804

Kong/Envoy实践互助QQ群:952503851

Ansible实践互助QQ群:955105412

Copyright @2011-2019 All rights reserved. 转载请添加原文连接,合作请加微信lijiaocn或者发送邮件: [email protected],备注网站合作 友情链接: lijiaocn github.com