
上QQ阅读APP看书,第一时间看更新
1.9.2 封装性
所谓类的封装是指在定义一个类时,将类中的属性私有化,私有属性只能在它所在的类中被访问。为了能让外界访问私有属性,可以设置公共接口去获取或者修改属性值。
在例1-90进行Student类设计时,需要对age、name属性做一些访问限定,不允许外界随便访问。这就需要实现类的封装。我们通过修改如下代码来实现对Student类的封装。
# -*- coding:utf-8 -*- # 类的创建 class Student(object): def __init__(self): self.__name = "" self.__age = 0 def setName(self, name): self.__name = name def setAge(self, age): if (age > 0): self.__age = age else: print "input age invalid" def getName(self): return self.__name def getAge(self): return self.__age if __name__ == '__main__': stu1 = Student() stu1.setName("Zhangsan") stu1.setAge(-1) print "stu1.getName() = %s" % (stu1.getName(),) print "stu1.getAge() = %d" % (stu1.getAge(),)
针对上述代码,这里给出相关说明。
1)name、age定义实例的私有属性。Python没有类似Java中的private、procoted、public的修饰符去区分实例私有属性和实例公有属性,而是通过观察在属性的名字前是否存在两个下划线作为开头,如果存在双下划线则表示其为私有属性;反之,则表示公有属性。
2)setName()、setAge()方法用于设置属性的值,可以在函数里增加逻辑以对输入的参数进行判断。getName()、getAge()方法作为外部接口,用于获取属性的值。这样就实现了对属性操作的封装。