python笔记:面向对象 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 = duckIns2 会飞的鸭子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): pass2 实现蛋糕命令,做一个蛋糕。如果不实现execute函数,将引发错误。因为我们添加了abc检查cake.pyimport 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() 来自 大脸猫 写于 2016-05-17 15:12 -- 更新于2020-10-19 13:06 -- 0 条评论