类的属性
类属性(公有属性)
类的私有属性
对象的公有属性
对象的私有属性
内置属性
函数的局部变量
全局变量
#!/usr/bin/python
# -*- coding:utf-8 -*-
class MyClass(object):
var1 = '类属性,类的公有属性 var1'
__var2 = '类的私有属性 __var2'
def fun1(self):
self.var3 = '对象的公有属性 var3'
self.__var4 = '对象的私有属性 __var4'
var5 = '函数的局部变量 var5'
def fun2(self):
print self.var1 #fun2方法调用类的公有属性
print self.__var2 #fun2方法调用类的私有方法
print self.var3 #fun2方法调用fun1的对象公有属性,需要先执行fun1方法才能访问
print self.__var4 #fun2方法调用fun1的对象私有属性,需要先执行fun1方法才能访问
# print var5 #不能访问
mc = MyClass()
print mc.var1 #类的公有属性
print mc._MyClass__var2 #类的私有属性,不建议这样使用
mc.fun1()
print mc.var3 #对象的公有属性
#print mc.__var4 #不能输出对象的私有属性
#print mc.var5 #不能输出方法的局部变量
mc1 = MyClass()
#print mc1.var3 #不能访问,没有调用fun1方法
print MyClass.var1 #直接使用类来方法公有属性
mc.fun2() #调用fun2方法
print mc.__dict__ #调用内置属性
类的方法
公有方法
私有方法
类方法
静态方法
内置方法
#!/usr/bin/python
# -*- coding: utf-8 -*-
class MyClass(object):
name = 'Test'
def __init__(self): #构造函数,内置方法
self.fun1()
self.__fun2()
self.classFun()
self.staticFun()
def fun1(self):
print self.name,
print "公有方法"
self.__fun2() #调用私有方法
def __fun2(self):
print self.name,
print "私有方法"
@classmethod #类方法装饰器
def classFun(self):
print self.name,
print "类方法"
@staticmethod #静态方法装饰器
def staticFun():
print MyClass.name, #使用类名引用类属性
print "静态方法"
mc = MyClass()
mc.fun1() #调用公有方法
#mc.__fun2() #不能调用,只能在类内调用
MyClass.classFun() #调用类方法
MyClass.staticFun() #调用静态方法
例子
编写一个memcached的启动脚本
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import sys,os
import subprocess import Popen, PIPE
class Process(object):
'''memcached rc script '''
def __init__(self, name, program, args, workdir): #name程序名字,program程序路径,args参数,workdir存放pid目录
self.name = name
self.program = program
self.args = args
self.workdir = workdir
def _init(self): #初始化方法
'''创建pid文件存放的目录/var/tmp/memcached'''
if not os.path.exists(self.workdir)
os.mkdir(self.workdir) #创建pid所在目录
os.chdir(self.workdir) #进入workdir目录
def _pidFile(self):
'''pid文件/var/tmp/memcached/memcached.pid'''
return os.path.join(self.workdir, "%s.pid" % self.name) #返回一个pid文件的绝对路径
def _writePid(self):
if self.pid:
with open(self._pidFile(), 'w') as fw: #打开pid文件
fw.write(str(self.pid)) #写入pid号
def _getPid(self):
p = Popen(['pidof', self.name], stdout=PIPE) #执行pidof命令
pid = p.stdout.read().strip() #得到pid
return pid
def start(self):
pid = self._getPid()
if pid: #判断程序是否已经启动
print "%s is running..." % self.name
sys.exit()
self._init()
cmd = self.program + ' ' + self.args
p = Popen(cmd, stdout=PIPE, shell=True) #执行运行命令
self.pid = p.pid
self._writePid() #执行写入pid方法
print "%s start Sucessful" % self.name
def stop(self):
pid = self._getPid()
if pid:
os.kill(int(pid), 15) #kill掉pid
if os.path.exists(self._pidFile()):
os.remove(self._pidFile()) #删除存放pid的文件
print "%s is stopped" % self.name
def restart(self):
self.stop()
self.start()
def status(self):
pid = self._getPid()
if pid:
print "%s is running" % self.name
else:
print "%s is not running" % self.name
def help(self):
print "Usage: %s {start|stop|restart|status}" % __file__
def main():
name = 'memcached'
prog = '/usr/bin/memcached' #memcached程序的路径
args = '-u nobody -p 11211 -c 1024 -m 64' #-u启动的用户名,-p端口号,-c最大连接数,-m缓存大小
wd = '/var/tmp/memcached'
pm = Process(name = name,
program = prog,
args = args,
workdir = wd)
try:
cmd = sys.argv[1] #抓取脚本没有参数的错误
except IndexError, e:
print "Option error"
sys.exit()
if cmd == 'start':
pm.start()
elif cmd == 'stop':
pm.stop()
elif cmd == 'restart':
pm.restart()
elif cmd == 'status':
pm.status()
else:
pm.help()
if __name__ == '__main__':
main()