首页
学习
活动
专区
圈层
工具
发布

python笔记:面向对象

1 封装与断言 在Python中,用类封装概念十分简单,下面是一个类的使用。所有的类都继承自object。在类的成员函数中,第一个参数必须是self,否则,这个函数就会变成类似java中的“静态函数”。__init__是构造函数,里面可以随意的定义类的属性。

代码语言:javascript
复制
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的主鸭子

代码语言:javascript
复制
class Duck(object):
    def __init__(self):
        pass
     
    def Do(self):
        self.Ins.Do()
 
    def SetIns(self,duckIns):
        self.Ins = duckIns

2 会飞的鸭子

代码语言:javascript
复制
class FlyDuck(object):
    def Do(self):
        print "fly!!!!"

3 会咕咕叫的鸭子

代码语言:javascript
复制
class GuguDuck:
    def Do(self):
        print "gugugugugu!!!!"

4 测试

代码语言:javascript
复制
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中,接口和抽象类只是广义的含义,系统默认不提供检查。

代码语言:javascript
复制
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

代码语言:javascript
复制
import icommand
 
class CakeCmd(icommand.Commands):
    def __init__(self,name):
        self.name = name
 
    def Execute(self):
        print self.name," is created"

3 测试

代码语言:javascript
复制
#命令模式 
import command
 
myList = command.icommand.CmdList()
 
cakeCmd = command.cake.CakeCmd(u"芝士蛋糕")
 
myList.Append(cakeCmd)
myList.Execute()
下一篇
举报
领券