【循序渐进学Python】面向对象知多少——私有权限

【循序渐进学Python】面向对象知多少——私有权限

今天我们学习私有权限,在一般在用户中,有些信息,是需要隐藏起来的,所以私有权限就出现了,那么什么是私有权限呢?

学习私有权限之前我们先回顾一下面向对象中封装的意义!

封装的意义相信看过我博客的都知道!没看过也不要紧,我把本篇需要用到的知识点都列举到下面了.

封装的意义

  1. 将属性和方法放到一起作为一个整体,然后通过实例化对象来处理

  2. 隐藏内部实现细节,只需要和对象及其属性和方法交互就可以了

  3. 对类的属性和方法增加 访问权限进行控制

私有权限的实现

  • 在属性名或方法名之前加上两个下划线

私有的概念

实例(对象)属性

  1. 公有属性(普通属性)

  • 类的外部或者类的内部都可以使用和访问

  • 类的外部:通过这个类创建一个对象。可以访问的属性

  • 类的内部:在这个类里面的方法内部可以使用的属性

  1. 私有属性

  • 类的内部:在这个类里面的方法内部均可使用的属性
  • 类的外部:通过对象名或类名都无法访问的属性

总结:

  1. 如果一个属性或者方法是以两个下划线开头,就称为私有属性或私有方法

  2. 私有属性和私有方法只能在类的内部使用

  3. 使用类的实例对象名传入系统的dir函数可以列出该对象的所有成员(属性方法)

  4. 在Python中的私有不是真正的私有,也可以访问,我们又不能通过这种方式访问,因为这是违规的

  5. 修改私有属性,可以通过间接的访问私有属性,然后进行修改

  6. 也可以通过在类的内部创建公开的方法间接访问私有属性,私有方法也是一样

  7. 只读/只写属性也可以使用这种方式进行处理

间接访问私有属性和方法案例

class Person(object):
    def __init__(self):
        self.name = "张三"
        # 私有属性
        self.__id = "123456789123"

    def say(self, wenti):
        if wenti == "id":
            return self.__id

    def work(self, x, y):
        print(self.__xinsuan(x, y))

    # 私有方法
    def __xinsuan(self, x, y):
        return x + y


zs = Person()
# 间接访问私有属性
print(zs.say("id"))
print(zs.work(2, 5))
# dir()函数
print(dir(zs))
print(dir(Person))
# __id是私有属性所以无法直接访问
# print(zs.id)
# __xinsuan是私有方法所以无法直接访问
# zs.__xinsuan(4,10)
print(zs.name)
zs.work(4, 10)
# 这样也可以直接访问私有属性,但是这样是不符合规矩的
print(zs._Person__id)

修改私有属性案例

需求:对于某些数据客户无法直接查看,对于服务商家而言也是无法直接查看的

class Bank(object):
    def __init__(self):
        self.id = 10011
        self.__pwd = "123123"
        print(self.__pwd)

    def set_pwd(self, pwd):
        self.__pwd = pwd

    def get_pwd(self):
        return self.__pwd


zs = Bank()
zs.id = 10021
# 对于私有的属性或方法,只有一种符合规则的办法进行调用,间接采用一个公开的方法来调用
# 修改私有属性
pwd = input("输入新密码:")
zs.set_pwd(pwd)
print(zs.get_pwd())

实战案例

需求:创建一个人类,这个类里面的属性:(姓名、年龄、身高等),要求人的年龄大于0小于300,如果用户填写小于0则默认为0

class Person(object):
    def __init__(self, name, age, height):
        self.name = name
        self.__age = 0
        self.height = height
        self.set_age(age)

    def set_age(self, age):
        if 0 < age < 300:
            self.__age = age
        elif age < 0:
            self.__age = 0
        elif age > 300:
            self.__age = 300

    def get_age(self):
        return self.__age


zs = Person("张三", 500, 1.75)
zs.set_age(-10)
print("姓名:%s,年龄:%d岁,身高:%.2f" % (zs.name, zs.get_age(), zs.height))

猜你喜欢

转载自blog.csdn.net/XVJINHUA954/article/details/108152051