클래스 내부에는 속성과 메서드가 있을 수 있으며, 외부 코드에서는 인스턴스 변수 메서드를 직접 호출하여 데이터를 조작할 수 있어 복잡한 내부 논리를 숨길 수 있습니다.
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에서 인스턴스의 변수 이름이로 시작하면 비공개 변수(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)
注:
就确保了外部代码不能随意修改对象内部的状态,这样通过访问限制的保护,代码更加健壮。
但是如果外部代码要获取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('bad score')
在Python中,变量名类似xxx的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用name、score这样的变量名。
Teacher会看到以一个下划线开头的实例变量名。
比如_name,这样的实例变量外部是可以访问的,但是,按照约定俗成的规定,当Teacher看到这样的变量时。
print(bart._Teacher__name)
代码解析:
双下划线开头的实例变量是不是一定不能从外部访问呢?其实也不是。不能直接访问name是因为Python解释器对外把name变量改成了_Teacher_name。
所以,仍然可以通过_Teacher_name来访问__name变量。
“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问”。
이 문서는 Python 기본 사항을 기반으로 합니다. 클래스에 변수 액세스 제한이 도입되었습니다. 사례 분석을 통해 실제 적용 시 주의가 필요한 사항과 직면한 문제에 대한 효과적인 솔루션을 제공합니다.
위 내용은 Python 액세스 제한에 대해 알려주는 기사의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!