面向对象
编程的一种方法
一些皆对象
面向过程和面向对象编程
面向过程编程:函数式编程。c等
面向对象编程:c++ ,java,python等
看具体问题
用哪种方法
类和对象:是面向对象中的两个重要的概念
类:是对事物的抽象,比如:人类,球类
对象:是类的一个实例,比如足球,篮球
方法:函数, 动态,动作
属性:变量,静态,一个事物的特征
实例说明
球类可以对球的特征和行为进行抽象,任何可以实例化一个真实的球体出来
面向对象的主要思想是:
封装 类的定义
类定义
类把需要的变量和函数组合成一起,这种包含称为封装
class A(object): (遵循首字母大写的定义)
类的结构
class类名:
成员变量-属性
成员函数-方法
继承
多态
这种思想方便解决较为复杂的项目,且维护起来较为容易
例如:
1 #!/usr/bin/python 2 class People(object): 3 color = 'yellow' 4 5 def think(self): 6 self.color = "black" 7 #print "I am a think" 8 print "I am a %s" % self.color 9 print "I am a think" 10 #classmethod 11 ren = People() 12 print ren.color 13 ren.think()
~
注意命令一致
类的属性
使用范围分为
共有属性 在类中和类外都能调用
私有属性 只能在类的内部调用 命名方法以"__"双下划线开始的变量
可以通过instamce.classname_attribute方式访问 实例化对象的名字._类的名字_属性
内置属性:由系统在定义类的时候默认添加,由前后双下划线构成,__dict__,等
类的方法
定义和函数一样,但需要self作为第一个参数
方法为:
共有方法 在类中和类外都可调用
私有方法 只能在类中调用,在方法前面加"__"双下划线
self 区别类方法与函数,self表示执行函数本身。
类方法(类的方法不能直接通过类调用)能被类直接调用的方法叫类方法 被classmethod(test)处理,括号内类的方法的名称
静态方法 相当于全局函数,不加self参数。需要staticmethod()处理
装饰器
@classmethod
@staticmethod
只对下面一个函数起作用
python内部类
内部类实例化方法
1、直接使用外部类调用内部类
object_name=outclass_name.inclass_name()
2、先对外部类进行实例化,然后在实例化内部类
out_name=outclass_name()
in_name=out_name.inclass_name()
in_name.method()
魔术方法
__str__(self) 更改直接打印类的输出结果
print ren
构造函数与析构函数
构造函数
__init__():可选,python后台不默认 提供
初始化类
析构函数:
__del__(); 可选,python后台会默认提供,
用于释放对象占用的资源
垃圾回收机制
python采用垃圾回收机制来清理不再使用的对象;python提供gc模块释放不在使用的对象,
python采用"引用计数"的算法方式来处理回收,即:当某个对象在其作用域内不在被其他对象引用的时候,python就自动清除对象
gc模块的collect()可以一次性收集所有待处理对对象(gc.collect)
类的继承
继承是面向对象的重要特征之一;
继承关系:继承是相对两个而言的父子关系,子类继承父类的所有公有属性和方法
继承实现了代码重用
使用继承
继承可以重用已经存在的数据和行为,减少代码的重复编写。python在类名后使用一对括号来表示继承关系,括号中的类即为父类。
class Myclass(ParentClass)
如果父类定义了__init__方法,子类必须显式调用父类的__init方法
ParentClass.init(self,[args..])
如果子类需要扩展父类的行为,可以添加__init__方法的参数。
多重继承
python支持多重继承,即一个类可以继承多个父类:
语法
class class_name(Parent_c1,Parent_c2,...) (谁在前面继承谁的所有属性,也可以直接调用)
注意
当父类中出现多个自定义的__init__方法时,多重继承只执行第一个类的__init__方法,其他不执行
类 的方法总结
写一个启动脚本(类的方式)
一类的定义与脚本的结构
确定脚本的结构
定义类的属性
1 #!/usr/bin/env python 2 #coding:utf8 3 import sys 4 import os 5 from subprocess import Popen, PIPE 6 class Process(object): 7 '''memcached rc script''' 8 args = {'USER':'memcached', 9 'PORT':11211, 10 'MAXCONN':1024, 11 'CACHESIZE':'64', 12 'OPTIONS':''} 13 def __init__(self, name, program , workdir): 14 self.name = name 15 self.program = program 16 17 self.workdir = workdir 18 def _init(self): 19 '''/var/tmp/memcached''' 20 if not os.path.exists(self.workdir): 21 os.mkdir(self.workdir) 22 os.chdir(self.workdir) 23 def _pidFile(self): 24 '''/var/tpm/memcached/memcached.pid''' 25 return os.path.join(self.workdir,"%s.pid" % self.name) 26 27 def _writhPid(self): 28 if self.pid: 29 with open(self._pidFile(),'w') as fd: 30 fd.write(str(self.pid)) 31 def _readConf(self, f): 32 with open(f) as fd: 33 lines = fd.readlines() 34 return dict([i.strip().replace('"','').split('=') for i in lines 35 def _parseArgs(self): 36 conf = self._readConf('/etc/sysconfig/memcached') 37 if 'USER' in conf: 38 self.args['USER'] = conf['USER'] 39 if 'PORT'in conf: 40 self.args['PORT'] = conf['PORT'] 41 if 'MAXCONN' in conf: 42 self.args['MAXCONN'] = conf['MAXCONN'] 43 if 'CACHESEIZE' in conf: 44 self.args['CACHESIZE'] = conf['CACHESIZE'] 45 options = ['-u', self.args['USER'], 46 '-p', self.args['PORT'], 47 '-m', self.args['CACHESIZE'], 48 '-c', self.args['MAXCONN']] 49 os.system("chown %s %s" % (self.args['USER'], self.workdir)) 50 return options 51 52 def start(self): 53 pid = self._getPid() 54 if pid: 55 print "%s is running..." % self.name 56 sys.exit() 57 self._init() 58 59 cmd = [self.program] + self._parseArgs() + ['-d','-P', self._pidFile 60 print cmd 61 p = Popen(cmd, stdout=PIPE) 62 # self.pid = p.pid 63 # self._writhPid() 64 print "%s start Sucessful" % self.name 65 66 def _getPid(self): 67 p =Popen(['pidof', self.name], stdout=PIPE) 68 pid = p.stdout.read().strip() 69 return pid 70 def stop(self): 71 pid = self._getPid() 72 if pid: 73 os.kill(int(pid), 15) 74 if os.path.exists(self._pidFile()): 75 os.remove(self._pidFile()) 76 print "%s is stopped" % self.name 77 78 def restart(self): 79 self.stop() 80 self.start() 81 82 83 def status(self): 84 pid = self._getPid() 85 if pid: 86 print "%s is already runing" % self.name 87 else: 88 print "%s is not runing" % self.name 89 90 def help(self): 91 print "Usage: %s {start|stop|status|restart} " % __file__ 92 93 def main(): 94 name = 'memcached' 95 prog = '/usr/bin/memcached' 96 args = '-u nobody -p 11211 -c 1024 -m 64' 97 wd = '/var/tmp/memcached' 98 pm = Process(name=name, 99 program=prog, 100 # args=args, 101 workdir=wd) 102 try: 103 cmd = sys.argv[1] 104 except IndexError,e: 105 print "Option error" 106 sys.exit() 107 if cmd == 'start': 108 pm.start() 109 elif cmd == 'stop': 110 pm.stop() 111 elif cmd == 'restart': 112 pm.restart() 113 elif cmd == 'status': 114 pm.status() 115 else: 116 pm.help() 117 if __name__ == '__main__': 118 main()