一篇文章帶教你Python訪問限制那些事兒

發布: 2023-07-25 16:50:29
轉載
1250 人瀏覽過

一、前言

在Class內部,可以有屬性和方法,而外部程式碼可以透過直接呼叫實例變數的方法來操作數據,這樣,就隱藏了內部的複雜邏輯。


二、案例分析

以Teacher類別的定義來看,外部程式碼還是可以自由地修改一個實例的name、score屬性。

class Teacher(object):


    def __init__(self, name, score):
        self.name = name
        self.score = score


    def print_score(self):
        print('%s: %s' % (self.name, self.score))


    def get_grade(self):
        if self.score >= 90:
            return 'A'
        elif self.score >= 60:
            return 'B'
        else:
            return 'C'




bart = Teacher('Bart Simpson', 98)
lisa = Teacher('Lisa Simpson', 87)


bart.score = 59
print(bart.score)


print('bart.score =', bart.score)
登入後複製

運行結果:

一篇文章帶教你Python訪問限制那些事兒

如果要讓內部屬性不被外部訪問,可以把屬性的名稱前加上兩個底線。

在Python中,實例的變數名稱如果以##開頭,就變成了一個私有變數(private),只有內部可以訪問,外部不能訪問,所以,Teacher把Teacher類別改一改:

class Teacher(object):    
  def __init__(self, name, score):     
    self.__name = name      
    self.__score = score   
  def print_score(self):    
    print('%s: %s' % (self.__name, self.__score))
登入後複製

改完后,对于外部代码来说,没什么变动,但是已经无法从外部访问实例变量.name和实例变量.score了:

bart = Teacher('Bart Simpson', 98)
print(bart.__name)
登入後複製

一篇文章帶教你Python訪問限制那些事兒

注:

就确保了外部代码不能随意修改对象内部的状态,这样通过访问限制的保护,代码更加健壮。

但是如果外部代码要获取name和score怎么办?可以给Teacher类增加get_name和get_score这样的方法:

class Teacher(object):  
  def get_name(self):     
    return self.__name   
  def get_score(self):    
    return self.__score
登入後複製

如果又要允许外部代码修改score怎么办?可以再给Teacher类增加set_score方法。

class Teacher(object):   
   def set_score(self, score):     
     self.__score = score
登入後複製

原先那种直接通过bart.score = 59也可以修改啊,为什么要定义一个方法大费周折?因为在方法中,可以对参数做检查,避免传入无效的参数:

class Teacher(object):   
  def set_score(self, score):        
    if 0 <= score <= 100:         
      self.__score = score      
      else:            
        raise ValueError(&#39;bad score&#39;)
登入後複製

在Python中,变量名类似xxx的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用namescore这样的变量名。

Teacher会看到以一个下划线开头的实例变量名。

比如_name,这样的实例变量外部是可以访问的,但是,按照约定俗成的规定,当Teacher看到这样的变量时。

print(bart._Teacher__name)
登入後複製

一篇文章帶教你Python訪問限制那些事兒

代码解析:

双下划线开头的实例变量是不是一定不能从外部访问呢?其实也不是。不能直接访问name是因为Python解释器对外把name变量改成了_Teacher_name

所以,仍然可以通过_Teacher_name来访问__name变量。

“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问”。


三、總結

本文基於Python基礎。介紹了在類別中,變數存取限制。透過案例的分析,在實際應用需要注意的點,遇到的問題,提供有效的解決方案。

以上是一篇文章帶教你Python訪問限制那些事兒的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:Go语言进阶学习
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板