1+ #!/usr/bin/env python3
2+ # -*- coding: utf-8 -*-
3+
4+ '练习面向对象的访问限制'
5+
6+ __author__ = 'sergiojune'
7+
8+ # 定义实例
9+ class Student (object ):
10+ def __init__ (self , name , score ):
11+ # 前面带了两个下划线表示对变量进行私有化,让外部不可以随意访问和修改
12+ # 但这个只是意识上私有而已,因为在外部我们可以通过 _类名__变量名 来访问,但不建议这样做,因为不同版本名字或许不一样
13+ # 所以私有了,一切靠自觉
14+ self .__name = name
15+ self .__score = score
16+
17+ def get_grade (self ):
18+ print ('my name is %s,my grade is %d' % (self .__name ,self .__score ))
19+
20+ # 当外界需要获取时,可以单独写一个方法来获取和设置
21+ # 这样做的好处就是使用户不能随意修改,因为是方法,所以可以实现一些逻辑判断
22+ def get_name (self ):
23+ return self .__name
24+
25+ def get_score (self ):
26+ return self .__score
27+
28+ def set_name (self ,name ):
29+ if isinstance (name ,str ):
30+ self .__name = name
31+ else :
32+ raise ValueError ('请输入正确名字' )
33+
34+ def set_score (self ,score ):
35+ if isinstance (score ,int ):
36+ self .__score = score
37+ else :
38+ raise ValueError ('请输入正确的成绩' )
39+
40+
41+ # 实例化
42+ bart = Student ('Bart' , 89 )
43+ bart .get_grade ()
44+ print (bart .get_name ())
45+ bart .set_score (56 )
46+ print (bart .get_score ())
47+ # 这样访问私有变量,显然正确,但不推荐这样做
48+ print (bart ._Student__name )
49+ # 但是你这样设置变量就错了
50+ bart .__name = 'new name' # 这样做只是给这个实例添加了__name 的属性,并不是修改了私有变量
51+ print (bart .get_name ()) # 可以看出这个名字还是不变
52+
53+
54+ # 作业:把下面的Student对象的gender字段对外隐藏起来,用get_gender()和set_gender()代替,并检查参数有效性
55+ class StudentA (object ):
56+ def __init__ (self , name , gender ):
57+ self .__name = name
58+ self .__gender = gender
59+
60+ def get_name (self ):
61+ return self .__name
62+
63+ def get_gender (self ):
64+ return self .__gender
65+
66+ def set_name (self ,name ):
67+ if isinstance (name , str ):
68+ self .__name = name
69+ else :
70+ raise ValueError ('请输入字符串的名字' )
71+
72+ def set_gender (self ,gender ):
73+ if isinstance (gender , str ):
74+ self .__gender = gender
75+ else :
76+ raise ValueError ('请输入正确性别' )
77+
78+
79+ # 检验是否正确
80+ bart = StudentA ('Bart' , 'male' )
81+ if bart .get_gender () != 'male' :
82+ print ('测试失败!' )
83+ else :
84+ bart .set_gender ('female' )
85+ if bart .get_gender () != 'female' :
86+ print ('测试失败!' )
87+ else :
88+ print ('测试成功!' )
0 commit comments