python类的属性和方法总结及rc脚本实例

类的属性总结

类属性相关内容如下

  • 类的公有属性
  • 类的私有属性
  • 对象的公有属性
  • 对象的私有属性
  • 对象的内置属性
  • 函数的局部变量
  • 函数的全局变量

是否可通过对象访问?

  • 类的公有属性可以实例化之后,通过对象直接访问。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #!/usr/local/python
    #coding:utf8

    class MyClass(object):
    var1 = '类属性,类的公有属性 var1'
    __var2 = '类的私有属性 __var2'

    def func1(self):
    self.var3 = '对象的共有属性 var3'
    self.__var4 = '对象的私有属性 __var4'
    var5 = '函数的局部变量'

    mc = MyClass()
    print mc.var1

执行结果

1
类属性,类的公有属性 var1

  • 类的私有属性实例化之后通过对象不可直接访问,可使用instance._classname__attribute方式访问。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #!/usr/local/python
    #coding:utf8

    class MyClass(object):
    var1 = '类属性,类的公有属性 var1'
    __var2 = '类的私有属性 __var2'

    def func1(self):
    self.var3 = '对象的共有属性 var3'
    self.__var4 = '对象的私有属性 __var4'
    var5 = '函数的局部变量'

    mc = MyClass()
    print mc._MyClass__var2
    print mc.__var2

执行结果

1
2
3
4
5
类的私有属性 __var2
Traceback (most recent call last):
File "1_9_6_3.py", line 16, in <module>
print mc.__var2
AttributeError: 'MyClass' object has no attribute '__var2'

  • 对象的公有属性需要调用对应的方法之后,才可以通过对象访问。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #!/usr/local/python
    #coding:utf8

    class MyClass(object):
    var1 = '类属性,类的公有属性 var1'
    __var2 = '类的私有属性 __var2'

    def func1(self):
    self.var3 = '对象的共有属性 var3'
    self.__var4 = '对象的私有属性 __var4'
    var5 = '函数的局部变量'

    mc = MyClass()
    mc.func1()
    print mc.var3
    mc1 = MyClass()
    print mc1.var3

执行结果

1
2
3
4
5
对象的公有属性 var3
Traceback (most recent call last):
File "1_9_6_3.py", line 17, in <module>
print mc1.var3
AttributeError: 'MyClass' object has no attribute 'var3'

  • 对象的私有属性,通过对象不可访问。
  • 函数的局部变量,通过对象不可访问。

是否可以通过类访问?

  • 公有属性可以直接通过类访问
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/usr/local/python
    #coding:utf8

    class MyClass(object):
    var1 = '类属性,类的公有属性 var1'
    __var2 = '类的私有属性 __var2'

    def func1(self):
    self.var3 = '对象的共有属性 var3'
    self.__var4 = '对象的私有属性 __var4'
    var5 = '函数的局部变量'

    print MyClass.var1

执行结果

1
类属性,类的公有属性 var1

  • 私有属性不可通过类直接访问。
  • 方法的公有属性和私有属性不可通过类直接访问。
  • 方法的公有属性只能通过对象来访问。

方法内部是否可以调用呢?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/local/python
#coding:utf8

class MyClass(object):
var1 = '类属性,类的公有属性 var1'
__var2 = '类的私有属性 __var2'

def func1(self):
self.var3 = '对象的共有属性 var3'
self.__var4 = '对象的私有属性 __var4'
var5 = '函数的局部变量'

def func2(self):
print self.var1
print self.__var2
print self.var3
print self.__var4

mc = MyClass()
mc.func1()
mc.func2()

执行结果

1
2
3
4
类属性,类的公有属性 var1
类的私有属性 __var2
对象的共有属性 var3
对象的私有属性 __var4

  • 方法内部可以直接调用类的公有属性和私有属性。
  • 方法内部调用其它方法的公有属性和私有属性,需要先执行该方法再调用,否则无法调用。
  • 方法内部无法调用其它方法的局部变量。
  • 内置属性可以通过对象或类调用。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    #!/usr/local/python
    #coding:utf8

    var5 = '全局变量 var5'
    class MyClass(object):
    var1 = '类属性,类的公有属性 var1'
    __var2 = '类的私有属性 __var2'

    def func1(self):
    self.var3 = '对象的共有属性 var3'
    self.__var4 = '对象的私有属性 __var4'
    var5 = '函数的局部变量 var5'
    print var5

    def func2(self):
    print self.var1
    print self.__var2
    print self.var3
    print self.__var4
    print var5

    mc = MyClass()
    mc.func1()
    print '#'*50
    mc.func2()
    print '#'*50
    print mc.__dict__
    print '#'*50
    print MyClass.__dict__

执行结果

1
2
3
4
5
6
7
8
9
10
11
函数的局部变量 var5
##################################################
类属性,类的公有属性 var1
类的私有属性 __var2
对象的共有属性 var3
对象的私有属性 __var4
全局变量 var5
##################################################
{'_MyClass__var4': '\xe5\xaf\xb9\xe8\xb1\xa1\xe7\x9a\x84\xe7\xa7\x81\xe6\x9c\x89\xe5\xb1\x9e\xe6\x80\xa7 __var4', 'var3': '\xe5\xaf\xb9\xe8\xb1\xa1\xe7\x9a\x84\xe5\x85\xb1\xe6\x9c\x89\xe5\xb1\x9e\xe6\x80\xa7 var3'}
##################################################
{'func2': <function func2 at 0x7fbeac51a8c0>, '__module__': '__main__', 'var1': '\xe7\xb1\xbb\xe5\xb1\x9e\xe6\x80\xa7\xef\xbc\x8c\xe7\xb1\xbb\xe7\x9a\x84\xe5\x85\xac\xe6\x9c\x89\xe5\xb1\x9e\xe6\x80\xa7 var1', '__weakref__': <attribute '__weakref__' of 'MyClass' objects>, 'func1': <function func1 at 0x7fbeac51a230>, '__dict__': <attribute '__dict__' of 'MyClass' objects>, '_MyClass__var2': '\xe7\xb1\xbb\xe7\x9a\x84\xe7\xa7\x81\xe6\x9c\x89\xe5\xb1\x9e\xe6\x80\xa7 __var2', '__doc__': None}

类的方法总结

  • 公有方法
  • 私有方法
  • 类方法
  • 静态方法
  • 内置方法
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    #!/usr/bin/python
    #coding:utf8

    class MyClass(object):
    name = 'Test'

    def func1(self):
    print self.name,
    print "我是公有方法"
    self.__func2() ## 类的内部调用私有方法

    def __func2(self):
    print self.name,
    print "我是私有方法"

    @classmethod
    def classFun(self):
    print self.name,
    print "我是类方法"

    @staticmethod
    def staticFun(): ## 不可添加self
    print MyClass.name, ## 通过类名调用
    print "我是静态方法"

    mc = MyClass()
    mc.func1()
    MyClass.classFun()
    MyClass.staticFun()

执行结果

1
2
3
4
Test 我是公有方法
Test 我是私有方法
Test 我是类方法
Test 我是静态方法

  • 公有方法可以在类的内部和外部调用;
  • 私有方法只能在类的内部调用;
  • 类方法添加装饰器,通过类调用

内置方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/usr/bin/python
#coding:utf8

class MyClass(object):
name = 'Test'

def __init__(self):
self.func1()
self.__func2()
self.classFun()
self.staticFun()

def func1(self):
print self.name,
print "我是公有方法"

def __func2(self):
print self.name,
print "我是私有方法"

@classmethod
def classFun(self):
print self.name,
print "我是类方法"

@staticmethod
def staticFun():
print MyClass.name,
print "我是静态方法"

mc = MyClass()

执行结果

1
2
3
4
Test 我是公有方法
Test 我是私有方法
Test 我是类方法
Test 我是静态方法

实例

使用python写一个memcached的启动脚本,可以参照/etc/init.d/memcached脚本。
下面是启动脚本的大体结构,下一章节详细介绍类中方法的实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#!/usr/bin/python
import sys

class Process(object):
'''memcached rc script'''
def __init__(self, name, program, args, workdir):
self.name = name
self.program = program
self.args = args
self.workdir = workdir

def _init(self):

def start(self):

def stop(self):

def restart(self):
self.stop()
self.start()

def status(self):

def help(self):

def main():
name = 'memcached'
prog = '/usr/bin/memcached'
args = '-u nobody -p 11211 -c 1024 -m 64'
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()

Recommended Posts