记录在了解编程语言时遇到一些特性。这里只关心那些可能影响到软件架构、开发模式的特性。常规语法、语法糖等不在此列。
面向对象中的概念。
语法:
在类中定义:
static returntype fucnname (arguments)
{
...
}
规则:
静态方法只能访问类的静态成员
非静态方法可以访问类的静态成员
静态方法可以用实例调用,也可以用类名调用
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)
在tornado中看到python中@的用法,摸不着头脑,查了下@的来源。
最早在python2.4中引入了Decorator语法.
PEP 318: Decorators for Functions and Methods
python2.4中引入了@staticmethod和@classmethod用更清晰的方式(Decorator)声明静态成员和类成员
编程中的一些通用或者常规的用法,被一些编程语言吸收成为新的语法, 这样的语法可以称作是语法糖。语法糖可以减少编程过程中的体力劳动, 但是语言学习过程中需要学习的内容也相应增加。
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下语句块执行时抛出的异常