Python_class,访问限制(私有属性和私有方法)

在面向对象中还有一个重点,就是"限制访问"
我们讲一个属性定义为私有属性,这样就在属性名前面加两条下划线:__xxx
私有属性是不可以随意访问的,通过访问限制来保护函数

class Hero(object):
    def __init__(self,name,skill): #我们将超级英雄的名字和技能导入
        self.name = name
        self.__skill = skill   #这里,钢铁侠小心机得隐藏了自己的属性(实例变量==>私有变量)

iron = Hero('Ironman','IonCannon')
print(iron.name)  #这里我们会得到Ironman
print(Hero.skill)  #这里却得不到IonCannon

但是,私有属性可以被类方法调用,如下面的show方法

上面说的,不能外部随意访问调用修改,但是其实....还是可以访问的,通过get_xxx方法

class Hero(object):
    def __init__(self,name,skill): #我们将超级英雄的名字和技能导入
        self.name = name
        self.__skill = skill #私有属性skill
    def get_skill(self):  #get只是一个格式,可以改其他不影响函数,只是在python习惯使用他(大家都这么用咱就不要做杠精好吧)
        return self.__skill  #这样通过实例内部调用,返回私有属性skill

iron= Hero('Ironman','IonCannon')
print(iron.get_skill())  #这样就可以打印出被隐藏的skill了~

#还有更残酷的,我们还可以通过set_xxx来修改,emmm...(说好的私有属性呢? (●ˇ∀ˇ●))
 

class Hero(object):
    def __init__(self,name): #我们将超级英雄的名字和技能导入
        self.name = name
        self.__skill = 'Kungfu' #私有属性skill,这里要做的是修改,所以我们想给skill赋值
    def get_skill(self):  #get只是一个格式,可以改其他不影响函数,只是在python习惯使用他(大家都这么用咱就不要做杠精好吧)
        return self.__skill  #这样通过实例内部调用,返回私有属性skill
    def set_skill(self,skill_02):
        self.__skill = skill_02  #这样通过实例内部调用,返回私有属性后再将参数skill_02f赋给他

iron= Hero('Ironman')
iron.set_skill('SuperIonCannon')
print(iron.get_skill())  #看看是不是边成‘超级离子炮了’

这里,就算__skill有默认属性依然可以通过这种方式修改
提到一点,以上的格式要严格安装不成文的规定写~这样大家才能其乐融融

....还有一点,我们是不是真的只能从内部调用呢???( ̄▽ ̄)",不是的

class Hero(object):
    def __init__(self,name,skill): #我们将超级英雄的名字和技能导入
        self.name = name
        self.__skill = skill #私有属性skill
iron= Hero('Ironman','IonCannon')
print(iron._Hero__skill) #==>'IonCannon'可以通过这样的函数直接访问得到私有属性

但是强烈建议你不要这么干,因为不同版本的Python解释器可能会把__name改成不同的变量名。(来自廖雪峰大师的博客)
还有一个...已经不能忍了,明明说好不饿能修改的呢???
用到的内置装饰器@property  

class Hero(object):
    def __init__(self,name,): #我们将超级英雄的名字和技能导入
        self.name = name
        self.__skill = 'KungFu'   
    @property                  #从这里开始
    def use_skill(self):
        return self.__skill
    @use_skill.setter
    def skill(self,skill):
        self.__skill = skill   #到这里接受

    def show(self):
        print('My name is %s, and my skill is %s'%(self.name,self.__skill))

iron = Hero('ironMan')
iron.skill = 'IonCannon'
iron.show()        

#*以上就是@property和set/get~~ 
#需要注意property是固定格式

@property                  #从这里开始
def use_skill(self):       #定义一个函数获取私有属性
    return self.__skill
@use_skill.setter          #这里是固定格式,即上一个函数名加上.setter
def skill(self,skill):     #传入变量修改私有属性
    self.__skill = skill   #毫无尊严是私有属性!!!!

好,现在来归纳总结一下,首先要注意变量名,必须是__xxx, (__xxx__不应该是这种,这个是魔方函数),
另外,有些会有_xxx一条下划线的变量,这样是没有私有属性的私有变量,即我们可以随意访问
但在作者其实不太愿意它被访问,所以遵守江湖规矩,当我们看到这样的属性的时候尽量不要范访问不要修改~~
还有一点:Python真的是语言界的耻辱,毫无规则可言,明明私有又能访问,还是能直接访问的。。。U•ェ•*U,以及后来会学到的'鸭子属性'...
=============================================================================
最后,在介绍一下Python的私有方法,它既不能通过类调用,也不能通过实例调用
和私有属性一样需要通过实例方法去间接获取它

class Hero(object):
    def __init__(self,name,skill): #我们将超级英雄的名字和技能导入
        self.name = name
        self.skill = skill
    def __hideskill(self):  #私有方法,我们假设他有个隐藏的技能,就是boooooo
        print('boooooooo')
    def get_hideskill(self): #通过一个方法得到另一个方法
        self.__hideskill()

iron = Hero('iIronman','IonCannon')
iron.get_hideskill()   #得到隐藏技能booooooo~

 

 

 


 


 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值