>백엔드 개발 >파이썬 튜토리얼 >Python 액세스 제한에 대해 알려주는 기사

Python 액세스 제한에 대해 알려주는 기사

Go语言进阶学习
Go语言进阶学习앞으로
2023-07-25 16:50:291282검색

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 액세스 제한에 대해 알려주는 기사

내부 속성을 외부에서 액세스하지 못하게 하려면 속성 이름 앞에 밑줄 두 개를 추가하면 됩니다.

Python에서 인스턴스의 변수 이름이 로 시작하면 비공개 변수(private)가 되어 외부에서는 액세스할 수 없고 내부에서만 액세스할 수 있습니다. 따라서 교사는 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 기본 사항을 기반으로 합니다. 클래스에 변수 액세스 제한이 도입되었습니다. 사례 분석을 통해 실제 적용 시 주의가 필요한 사항과 직면한 문제에 대한 효과적인 솔루션을 제공합니다.

위 내용은 Python 액세스 제한에 대해 알려주는 기사의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 Go语言进阶学习에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제