1.类的属性总结
脚本练习:
2.打印各种类的属性
(1)访问类的公有属性
执行结果:
(2)访问类的私有属性
执行结果:
不建议使用这种方式访问类的私有属性,只是为了测试。
(3)访问对象的公有属性
执行结果:
结论:必须要先调用方法,才能使用方法里面的属性。
(4)访问对象的私有属性
执行结果:
结果:这样访问是不行的,不能再类外面访问对象的私有属性。
(5)访问函数的局部变量
执行结果:
结果:也不能用这种方法访问函数的局部变量。
总结:类的公有属性,可以通过对象访问
类的私有属性,也可以通过对象来访问
对象的公有属性,要先调用方法,才能通过对象来访问。
对象的私有属性,通过对象不能访问
函数的局部变量,在类的外面,通过对象也不能访问。
下面我们通过类来访问这些属性:
(1)访问公有属性
执行脚本:
没问题
(2)通过类访问私有属性:
执行脚本:
不可以访问
(3)通过类访问对象的公有属性
执行脚本:
不能访问。
说明:对象的属性,只能通过对象来访问
执行脚本:
可以执行
补充:对象的属性和类的属性的区别
①脚本中位置不一样
②类的属性是定义在方法外
③对象的属性是对应在方法里
测试这些属性在类的内部使用:
(1)在内部访问类的公有、私有属性
执行结果:
公有、私有属性都可以被访问。
(2)在类内部访问对象的公有属性
执行结果
(3)在类内部访问对象的私有属性
执行结果:
也可以访问对象的私有属性。
(4)在方法内调用对象的私有属性和函数局部变量
执行结果:
可以访问到
var5可以再fun1()里面被访问,不能再fun2()中被访问,除非把var5定义为全局变量,全局变量是在类的外部定义的。
如下图所示:
(5)访问类的内置属性
执行结果:
2.类的方法总结
(1)定义方法
(2)调用一下,查看这些方法可以在什么地方被调用
①调用公有方法L:
执行脚本:
②调用私有方法:
执行脚本:
如图,不能被调用,私有方法只能在类的内部被调用。
③调用类方法:
在类方法上面加上“装饰器”,有了装饰器,表示这个方法可以被类来调用;
调用方法如下:
执行脚本:
可以执行,要加上装饰器才可以被类调用。
④调用静态方法
静态方法也是通过类来调用的,静态调用不能通过self,所以改成类来调用name,如下:
调用方法:
执行结果:
练习
memcache 的启动脚本:
import sys
import os
from subprocess import Popen, PIPE
class Process(object):
'''memcached rc script'''
args = {'USER':'memcached',
'PORT':'11211',
'MAXCONN':1024,
'CACHESIZE':64,
'OPTIONS':''}
def __init__(self, name, program, workdir):
self.name = name
self.program = program
self.workdir = workdir
def _init(self):
'''/var/run/memcached'''
if not os.path.exists(self.workdir):
os.mkdir(self.workdir)
os.chdir(self.workdir)
def _pidFile(self):
'''/var/run/memcached/memcached.pid'''
return os.path.join(self.workdir,"%s.pid" % self.name)
def _getPid(self):
p = Popen(['pidof',self.name],stdout=PIPE)
return p.stdout.read().strip()
def _writePid(self):
pid = self._getPid
if self.pid:
with open(self._pidFile(),'w') as fd:
fd.write(str(self.pid))
return pid
def _readConf(self,f):
with open(f) as fd:
lines = fd.readlines()
return dict([i.strip().replace('"','').split('=') for i in lines])
def _parseArgs(self):
conf = self._readConf('/etc/sysconfig/memcached')
if 'USER' in conf:
self.args['USER'] = conf['USER']
if 'PORT' in conf:
self.args['PORT'] = conf['PORT']
if 'MAXCONN' in conf:
self.args['MAXCONN'] = conf['MAXCONN']
if 'CACHESIZE' in conf:
self.args['CACHESIZE'] = conf['CACHESIZE']
options = ['-u', self.args['USER'],
'-p', self.args['PORT'],
'-m', self.args['CACHESIZE'],
'-c', self.args['MAXCONN']]
os.system("chown %s %s" % (self.args['USER'],self.workdir))
return options
def start(self):
pid = self._getPid()
if pid:
print "%s is runnig..." % self.name
sys.exit()
self._init()
cmd = [self.program] + self._parseArgs() + ['-d','-P',self._pidFile()]
print cmd
p = Popen(cmd, stdout = PIPE)
#self.pid = p.pid
#self._writePid()
print "%s start sucessful" % self.name
def stop(self):
pid = self._getPid()
print "kill the pid %s" % pid
if pid:
os.kill(int(pid),15)
if os.path.exists(self._pidFile()):
os.remove(self._pidFile())
print "%s is stopped" % self.name
def restart(self):
self.stop()
self.start()
def status(self):
pid = self._getPid()
if pid:
print "%s is already running" % self.name
else:
print "%s is not running" % self.name
def help():
print "Usage: %s {start|stop|status|restart}" % __file__
def main():
#pm = Process()
name = 'memcached'
program = '/usr/bin/memcached'
workdir = '/var/run/memcached'
pm = Process(name = name,program = program,workdir = workdir)
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()
转载于:https://blog.51cto.com/286577399/2047307