Skip to content

Commit ef9099e

Browse files
authored
练习面向对象的访问限制
1 parent 4d240ee commit ef9099e

File tree

1 file changed

+88
-0
lines changed

1 file changed

+88
-0
lines changed

test17.py

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
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

Comments
 (0)