首页 python基础教程 Python面向对象-私有化属性的定义和调用
pay pay

Python面向对象-私有化属性的定义和调用

日期: 2021年12月4日 04:05
栏目: python基础教程
阅读: 103
作者: python自学网

摘要: 上篇文章我们讲到一种属性-私有化属性,这篇文章我们将从私有化属性实现原理,应用场景两个方面进行详细的讲解。

上篇文章我们讲到一种属性-私有化属性,这篇文章我们将从私有化属性实现原理,应用场景两个方面进行详细的讲解。

一、私有化属性原理

下面我们定义一个类,在类中定义3中不同类型的属性,通过__dict__来探索一下私有化属性的实现原理。

class Person:
    name = 'Tom'  # 公有属性
    _age = 18  # 受保护属性
    __sex = '男'  # 私有属性

print(Person.__dict__)

通过__dict__我们可以看到下面的返回结果。

{'__module__': '__main__', 'name': 'Tom', '_age': 18, '_Person__sex': '男', '__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__': <attribute '__weakref__' of 'Person' objects>, '__doc__': None}

从结果中我们看到这样一个结果:'_Person__sex': '男', 这正是我们定义的私有化属性,但是键名也就是属性名前面加上一个_Person,这也是python存储私有属性的方法,同时我们在外面调用私有属性的时候没办法直接访问的原因。换个角度我们可以直接访问 _类__sex 来实现私有属性__sex的访问。

print(Person._Person__sex)

返回结果:男

这时候我们就能访问私有属性了,所以说python语言中没有真正意义上的私有属性,但是可以通过下划线完成一种伪私有效果。那私有化属性又有神马具体存在的意义呢?

二、私有化属性应用场景

class Card:
    def __init__(self):
        self.name = 'Tom'  # 要初始化对象所以要加self
        self.__money = 100

    def setMoney(self, val):
        if (isinstance(val, int) or isinstance(val, float)) and val >= 0:  # 对私有属性进行二次加工
            self.__money = self.__money - val
        else:
            print('请输入正确的金额!')

    def getMoney(self):
        return self.__money

p = Card()
print(p.name)
# print(p.__money)  # 无法访问,可以借助类方法来访问,实现对私有化属性的控制
p.setMoney(55.3)
print(p.getMoney())

通过上面的ATM机设计,我们可以知道私有属性在特殊场景中具有私密性,同时通过间接的操作能保护数据操作安全。

目录
回顶部