静态语言和动态语言
我们所说的动态语言、静态语言是指动态类型语言和静态类型语言。
动态语言:指在程序运行期间才做类型检查的,如Python 和 Ruby。
静态类型:静态类型语言与动态类型语言刚好相反,它的数据类型是在编译其间检查的,也就是说在写程序时要声明所有变量的数据类型,C/C++ 是静态类型语言的典型代表;
动态语言的优点:在编写代码时数量更少更简洁,把更多的精力放到业务实现逻辑上。虽然不区分类型在某些情况下会让程序变得难以理解,但整体而言,代码量越少,越专注于逻辑表达,对阅读程序越有帮助。
动态语言的缺点:无法保证变量的类型,从而在程序的运行期有可能发生跟类型相关的错误。
class动态添加属性和方法
在定义类时__init__方法用来声明属性并初始化各个属性值,当创建好一个对象实例后可以给这个实例单独添加一个属性。看下面的例子:
#coding=utf-8
import types
class Person():
def __init__(self,name):
self.__name = name
def __str__(self):
return 'name is:' + self.__name
def getName(self):
return self.__name
def run(self):
print('++++++++++run function++++++++++++')
@staticmethod
def staticFunc():
print('==============static ===========')
@classmethod
def clsFunc(cls):
print('++++++++++++++++++cls+++++++++++++')
p1 = Person('zhangsan')
print(p1.getName())
p1.age = 10
print(p1.age)
p1.__addr = '北京'
print(p1.__addr)
p1.run = types.MethodType(run,p1)
p1.run()
Person.staicFunc = staticFunc
Person.clsFunc = clsFunc
Person.staicFunc()
Person.clsFunc()
结果:
zhangsan
10
北京
++++++++++run function++++++++++++
==============static ===========
++++++++++++++++++cls+++++++++++++
需要注意的是在__init__方法中以__开始的属性的是私有属性,但是即便是给实例对象添加一个__开始的属性也不再是私有属性了。
给一个实例对象添加一个方法需要用到types包的MethodType方法。代码中 p1.run = types.MethodType(run,p1)的意思就是给p1对象绑定一个run方法。其中p1.run是可以换成别的字符的,但是一般来说为了便于理解都用要添加的方法名称来作为MethodType的返回值。还要注意的是在定义run方法时要默认增加一个self参数,这是为了和基本的类中定义的方法保持一致。
静态方法不属于实例对象,因此直接用类名的形式就可以添加,同理类方法也是如此。在定义类方法时也要符合基本的定义规范,即加上cls参数。