隐藏类中的属性 | Python从入门到精通:高阶篇之二十七

封装简介 | Python从入门到精通:高阶篇之二十六

封装

针对上一节的知识,我们来做一个补充:
封装的第五个优点:
使用getter方法可以表示一些计算的属性。

class Rectangle:
    '''
        表示矩形的类
    '''
    def __init__(self,width,height):
        self.hidden_width = width
        self.hidden_height = height

    def get_width(self):
        return 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 get_area(self):
        return self.hidden_width * self.hidden_height        

r = Rectangle(5,2)  

print(r.get_area())     

执行结果:

隐藏类中的属性 | Python从入门到精通:高阶篇之二十七

若改变宽度、高度,面积则进行了改变。

r.set_width(10)
r.set_height(20)

执行结果:

隐藏类中的属性 | Python从入门到精通:高阶篇之二十七
隐藏类中的属性 | Python从入门到精通:高阶篇之二十七

隐藏类中的属性

先定义一个新类。

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())

执行结果:

隐藏类中的属性 | Python从入门到精通:高阶篇之二十七

此时对name做一个修改:

p.set_name('猪八戒')
p.hidden_name = '沙和尚'

执行结果:

隐藏类中的属性 | Python从入门到精通:高阶篇之二十七
隐藏类中的属性 | Python从入门到精通:高阶篇之二十七

此时可以发现,有时隐藏了外部也是可以访问的,这是想要把隐藏的更彻底,外部无法访问。
此时可以为对象的属性使用双下划线开头,__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)  __开头的属性是隐藏属性,无法通过对象访问
p.__name = '猪八戒'  

print(p.get_name())

执行结果:

隐藏类中的属性 | Python从入门到精通:高阶篇之二十七
隐藏类中的属性 | Python从入门到精通:高阶篇之二十七
隐藏类中的属性 | Python从入门到精通:高阶篇之二十七

此时也无法进行修改。
其实隐藏属性只不过是Python自动为属性改了一个名字,实际上是将名字修改为了,_类名__属性名 ,比如__name -> _Person__name。

print(p._Person__name)
p._Person__name = '猪八戒'

执行结果:

隐藏类中的属性 | Python从入门到精通:高阶篇之二十七
隐藏类中的属性 | Python从入门到精通:高阶篇之二十七

此时是可以访问的,也是可以修改的。

使用__开头的属性,实际上依然可以在外部访问,所以这种方式我们一般不用。
一般我们会将一些私有属性(不希望被外部访问的属性)以_开头。

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)

执行结果:

隐藏类中的属性 | Python从入门到精通:高阶篇之二十七

一般情况下,使用_开头的属性都是私有属性,没有特殊需要不要修改私有属性。

配套视频课程,点击这里查看

获取更多资源请订阅Python学习站

上一篇:DOORS的引用类型


下一篇:VS中C#连接SQLite数据库处理器架构“x86”不匹配的问题