开发者学堂课程【Python 语言基础 3:函数、面向对象、异常处理:隐藏类中的属性】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/601/detail/8748
隐藏类中的属性
目录:
一、封装的优点
二、隐藏属性
一、封装的优点
封装的优点,由于它在以下代码里有些地方是无法体现的,所以现在讲它的第二个优点。
class Dog:
…
表示狗的分类
…
def_init_ (self , name , age):
self. hidden_ name = name
self.hidden_ age = age
def say_ hello(self):
print(‘大家好,我是%s "%seIf. hidden_ name )
def get_ name(self):
…
get_name( )用来获取对象的name属性
…
首先,先创建一个新的文件,以封装命名,它的第二个优点仍然围绕我们的 getter方法和 setter 方法,使用 setter 方法设置属性,可以增加数据的验证,确保数据的值是正确的。使用 getter 方法获取属性,可以使用 setter 方法设置属性。在某些情况下我们会创建一些特殊类
class Rectangle :
…
表示矩形的类
…
def_init_ (self , width,height):
self. hidden_ width = width
self. hidden_ height = height
def get_width(self):
retern self. hidden_ width
def get_height(self):
return self. hidden_ height
def set_width(self , width):
self. hidden_ width = width
def set_ height(self , height):
self. hidden_ height = height
矩形里面有个面积公式,因为已经设置了它的长度和宽度,所以它的面积是不需要设置的直接就能得出来,此时若需要知道它的面积,只需要在代码后面加上
def set_areg(self):
return self.hidden_width * self.hidden_height
即可得出面积
设置长度和宽度
r = Rectangle(5,2)
print(r.get_area())
运行结果显示为在长为 5 宽为 2 的矩形里,面积为 10
由此可以看出它的另一个优点为:使用 getter 方法可以表示一些计算的属性
二、隐藏属性
class Person:
def_init_ (self ,name):
self. hidden_ name = name
def get_ name(self) :
return self. hidden_ name
def set_ name(self , name) :
self. hidden_ name = name
p = Person(‘孙悟空’)
print(p.get_name())
现在这种隐藏属性的封装方式主要就是在属性前面加上 hidden,外部依然可以访问,但在某些情况下我们不希望外部可以访问,那就可以为对象的属性使用双下划线开头,_xxx 后面跟属性。双下划线开头的属性,是对象的隐藏属性,隐藏属性只能在类的内部,无法通过对象访问。
class Person:
def __init__ (self , name):
self.__name = name
def get_ name(self):
return self.__name
def set_ name(self , name) :
self.__name = name
p = Person(‘孙悟空’)
print(p.__name)
print(p.get_ name( ))
因为双下头线的开头属性是隐藏属性,无法通过对象访问
隐藏属性只不过是 Python 自动为属性改了名字。实际上是将名字修改为了,_类名_属性名 比如 __name -> _Person__name
class Person:
def __init__ (self , name):
self.__name = name
def get_ name(self):
return self.__name
def set_ name(self , name) :
self.__name = name
p = Person(‘孙悟空’)
print(p.__Person__name)
p._Person__name = ‘猪八戒’
print(p.get_ name( ))
同理 给函数加双下划线也是一样的,使用__开头的属性,实际上依然可以外部访问,所以这种方式我们一般不用,一般我们会将一些私有属性(不希望被外部访问的属性)以_开头。
一般情况下使用_开头的属性都是私有属性,没有特殊需要不要修改私有属性。