Python のアクセス制限について説明する記事

リリース: 2023-07-25 16:50:29
転載
1250 人が閲覧しました

1. はじめに

クラス内にはプロパティとメソッドを含めることができ、外部コードはインスタンス変数メソッドを直接呼び出すことでデータを操作できます。複雑な内部ロジックが隠されています。


#2. 事例分析

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))


    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 のアクセス制限について説明する記事

もしよろしければ属性には外部からアクセスできません。属性名の前に 2 つのアンダースコアを追加できます。

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变量。

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


#3. 概要

この記事は、パイソン。クラスに変数アクセス制限を導入しました。事例分析を通じて、実務での注意点や課題を解決する効果的な解決策をご提案します。

以上がPython のアクセス制限について説明する記事の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:Go语言进阶学习
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
関連するチュートリアル
人気のおすすめ
最新のコース
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート