复习(67)
1 # 模块: 2 # 模块是Python组织代码的基本方式。 3 # 一个Python脚本可以单独运行,也可以导入到另一个脚本中运行,当脚本被导入运行时,我们将其称为模块(module)。 4 # 所有的.py文件都可以作为一个模块导入 5 # 模块名与脚本的文件名相同 6 # 例如我们编写了一个名为hello.py的脚本,则可以在另一个脚本中用import hello语句来导入它。 7 # 包: 8 # Python的模块可以按目录组织为包 9 # 创建一个包的步骤: 10 # 创建一个名字为包名的目录 11 # 在该目录下创建一个__init__.py文件 12 # 根据需要,在该目录下存放脚本文件或已编译的扩展及子包 13 # 面向对象介绍: 14 # 面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想。 15 # OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。 16 # 面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行。 17 # 为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统的复杂度。 18 # 而面向对象的程序设计把计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消息在各个对象之间传递。 19 # 在Python中,所有数据类型都可以视为对象,当然也可以自定义对象。自定义的对象数据类型就是面向对象中的类(Class)的概念。 20 # 类的属性: 21 # 类的属性按使用范围分为公有属性和私有属性,类的属性范围取决于属性的名称。 22 # 公有属性:在类中和类外都能调用的属性。 23 # 私有属性:不能在类外及被类以外的函数调用。 24 # 定义方式:以”__”双下划线开始的成员变量就是私有属性 25 # 可以通过instance._classname__attribute方式访问。 26 # 内置属性:由系统在定义类的时候默认添加的,由前后双下划线构成,__dict__, __module__。 27 # 类的方法: 28 # 方法的定义和函数一样,但是需要self作为第一个参数。 29 # 类方法为: 30 # 公有方法 31 # 私有方法 32 # 类方法 33 # 静态方法 34 # 公有方法:在类中和类外都能调用的方法。 35 # 私有方法:不能被类的外部调用,在方法前面加上”__”双下划线就是私有方法。 36 # self参数 37 # 用于区分函数和类的方法(必须有一个self),self参数表示执行对象本身。 38 # 类方法:被classmethod() 39 # 函数处理过的函数,能被类所调用,也能被对象所调用(是继承的关系) 40 # 静态方法:相当于”全局函数”,可以被类直接调用,可以被所有实例化对象共享,通过staticmethod() 41 # 定义,静态方法没有”self”参数。 42 # 装饰器: 43 # - @ classmethod 44 # - @ staticmethod 45 # 类的内置方法: 46 # 方法1:直接使用外部类调用内部类 47 # object_name = outclass_name.inclass_name() 48 # 方法2:先对外部类进行实例化,然后再实例化内部类 49 # out_name = outclass_name() 50 # in_name = out_name.inclass_name() 51 # in_name.method() 52 # 类的继承: 53 # 即一个派生类(derived class )继承基类(base class )的字段和方法。 54 # 继承也允许把一个派生类的对象作为一个基类对象对待。 55 # 例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。 56 57 # rc: 58 import sys 59 import os 60 from subprocess import Popen, PIPE 61 62 class Process(object): 63 '''memcached rc script''' 64 def __init__(self, name, program, args, workdir): 65 self.name = name 66 self.program = program 67 self.args = args 68 self.workdir = workdir 69 70 def _init(self): 71 '''/var/tmp/memcached''' 72 if not os.path.exists(self.workdir): 73 os.mkdir(self.workdir) 74 os.chdir(self.workdir) 75 76 def _pidFile(self): 77 '''/var/tmp/memcached/memcached.pid''' 78 return os.path.join(self.workdir, "%s.pid" % self.name) 79 80 def _writhPid(self): 81 if self.pid: 82 with open(self._pidFile(), 'w') as fd: 83 fd.write(str(self.pid)) 84 85 def start(self): 86 pid = self._getPid() 87 if pid: 88 print "%s is running..." % self.name 89 sys.exit() 90 self._init() 91 cmd = self.program + ' ' + self.args 92 p = Popen(cmd, stdout=PIPE, shell=True) 93 self.pid = p.pid 94 self._writhPid() 95 print "%s start Sucessful" % self.name 96 97 def _getPid(self): 98 p = Popen(['pidof', self.name], stdout=PIPE) 99 pid = p.stdout.read().strip() 100 return pid 101 102 def stop(self): 103 pid = self._getPid() 104 if pid: 105 os.kill(int(pid), 15) 106 if os.path.exists(self._pidFile()): 107 os.remove(self._pidFile()) 108 print "%s is stopped" % self.name 109 110 def restart(self): 111 self.stop() 112 self.start() 113 114 def status(self): 115 pid = self._getPid() 116 if pid: 117 print "%s is already running" % self.name 118 else: 119 print "%s is not running" % self.name 120 121 def help(self): 122 print "Usage: %s {start|stop|status|restart}" % __file__ 123 124 def main(): 125 name = 'memcached' 126 prog = '/usr/bin/memcached' 127 args = '-u nobody -p 11211 -c 1024 -m 64' 128 wd = '/var/tmp/memcached' 129 pm = Process(name = name, 130 program = prog, 131 args = args, 132 workdir = wd) 133 try: 134 cmd = sys.argv[1] 135 except IndexError, e: 136 print "Option error" 137 sys.exit() 138 if cmd == 'start': 139 pm.start() 140 elif cmd == 'stop': 141 pm.stop() 142 elif cmd == 'restart': 143 pm.restart() 144 elif cmd == 'status': 145 pm.status() 146 else: 147 pm.help() 148 149 if __name__ == '__main__': 150 main()