1 封装与断言 在Python中,用类封装概念十分简单,下面是一个类的使用。所有的类都继承自object。在类的成员函数中,第一个参数必须是self,否则,这个函数就会变成类似java中的“静态函数”。__init__是构造函数,里面可以随意的定义类的属性。
class Employee(object):
def __init__(self):
self._no=0
self._name=""
def GetNo(self):
return self._no
def SetNo(self,val):
assert isinstance(val,int),"val must be int"
self._no = val
def GetName(self):
return self._name
def SetName(self,val):
assert isinstance(val,basestring),"val must be string"
self._name=val
employee = Employee()
employee.SetName("yinzihao")
employee.SetNo(346093)
print employee.GetName(),"#",employee.GetNo()
2 抽象(这里通过实现策略模式举例) 1 python没有接口,抽象类。检查类型需要用isinstance()函数。 2 python是强类型语言,只是是动态类型的。 3 开搞!实现策略模式。head first中的鸭子帮。 1 Duck的主鸭子
class Duck(object):
def __init__(self):
pass
def Do(self):
self.Ins.Do()
def SetIns(self,duckIns):
self.Ins = duckIns
2 会飞的鸭子
class FlyDuck(object):
def Do(self):
print "fly!!!!"
3 会咕咕叫的鸭子
class GuguDuck:
def Do(self):
print "gugugugugu!!!!"
4 测试
import Duck
myduck = Duck.Ducker.Duck()
myduck.SetIns(Duck.FlyDuck.FlyDuck())
myduck.Do()
myduck.SetIns(Duck.GuguDuck.GuguDuck())
myduck.Do()
输出: fly!!!! gugugugugu!!!! 3 “抽象类”支持 在python 中需要手工进行类型检查,系统提供了abc包。 在这个例子中,实现设计模式中的命令模式,命令模式具体含义不再细述。 1 实现命令模式抽象主体 所有命令的执行者是CmdList类。Commands类是命令的抽象,是一个“抽象类”,供别人来继承。继承Commands的类必须实现“Execute”函数,否则系统panic。这是因为导入了abc包,它提供了函数实现检查。 在python中,接口和抽象类只是广义的含义,系统默认不提供检查。
icommand.py
import abc
class CmdList(object):
def __init__(self):
self._innerList = []
def Append(self,cmd):
if isinstance(cmd,Commands):
self._innerList.append(cmd)
else:
raise Exception("baseclass not icommand.Commands")
def Execute(self):
for item in self._innerList:
item.Execute()
class Commands(object):
__metaclass__ = abc.ABCMeta #这一行一定要加,否则检查功能失效
def __init__():
pass
#这是python的装饰器,原理参考装饰模式,这里不细说。
@abc.abstractmethod
def Execute(self):
pass
2 实现蛋糕命令,做一个蛋糕。如果不实现execute函数,将引发错误。因为我们添加了abc检查 cake.py
import icommand
class CakeCmd(icommand.Commands):
def __init__(self,name):
self.name = name
def Execute(self):
print self.name," is created"
3 测试
#命令模式
import command
myList = command.icommand.CmdList()
cakeCmd = command.cake.CakeCmd(u"芝士蛋糕")
myList.Append(cakeCmd)
myList.Execute()