Python3中的访问限制详解

访问限制
                私有:只能自己使用,别人不能使用
                好处:1.外部不能随意更改   提高了安全性
                           2.可以起到数据过滤的作用
                格式:在构造函数变量的前边加上两个下划线__
                看个案例:
                创建一个Person类,有name和age两个属性,其中age为私有属性,不可从外部更改。

class Person:
    def __init__(self):
        self.name=None
        self.__age=None  # age前边加两个下划线是访问限制的标志
#这时候在进行创建对象并调用类属性的时候,对象是无法获得age的赋值权限的。

上边我们进行了对age的访问限制,但是真的就没有其他的方法去修改age的值了吗?答案是当然有!

1.创建在内部创建set和get函数

class Person:
    def __init__(self):
        self.name=None
        self.__age=None

    def setAge(self,a):
        if a<0:
            print("不合法")
        else:
            self.__age=a
    def getAge(self):
        return self.__age

p1=Person()
p1.setAge(-10)
print(p1.getAge())

通过这种方法,我们就达到了修改限制属性的值,访问限制还有一个比较有用的功能就是数据过滤的功能,这个就比较有用了,比如我上边的代码,如果我输入的年龄为负值,那么就提示我输入不合法,这样也就没有给age赋上值,只有输入正确的格式时才能进行赋值,所以这一功能也就避免了记录一些没有用的数值。

2.使用@property装饰器代替set,get方法进行外部访问限制

                      @property 是一个装饰器,当我们设置set,get时,代码会比较繁琐,这个装饰器就是解决这个问题的
                      @property 和set,get的使用区别是,当只为get行为添加装饰器@property时,
                      实例对象只能读取构造函数属性,但是不能进行修改,
                      如果想要修改必须为set行为添加@xx.setter装饰器(有@property时自动生成)。

看例子:

class Cat:
    def __init__(self,name):
        self.__name = name

    @property
    def name(self):
        return self.__name
    #注意观察@name.setter写与不写,实例对象属性的变化
    @name.setter
    def name(self,value):
        self.__name = value

c = Cat('小白')
c.name = '小花'#看变化
print(c.name)

通过这种方法,我们就达到了节省代码量的目的,也实现了访问限制。

下面看一个访问限制的作业题:

# 练习题:
#       有两只猫:
#       一只叫小花,今年3岁,花色。
#       另一只叫小白,今年3岁,白色。
#       请编写一个程序,当用户输入小猫的名字时,就显示该猫的名字、年龄、颜色。
#       如果输入的小猫名错误,则显示 张老太没有这只猫。
# 要求:
#       猫的属性全为私有属性
#       通过set修改属性,通过get获取属性

class Cat:
    def __init__(self):
        self.__name = None
        self.__age = None
        self.__color = None
    def set(self,name,age,color):
        self.__name = name
        self.__age = age
        self.__color = color
    def get(self):
        return self.__name,self.__age,self.__color

c1,c2= Cat(),Cat()
c1.set('小花','3岁','花色')
c2.set('小白','3岁','白色')

cn = input('请输入猫名:')
if cn == '小花':
    print(c1.get())
elif cn == '小白':
    print(c2.get())
else:
    print('张奶奶没有这只猫!')

 

  • 19
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XeeP--H

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值