캡슐화
1. 왜 캡슐화하나요?
캡슐화는 데이터 속성 및 메소드의 구체적인 구현 세부사항을 숨기고 인터페이스만 제공하는 것입니다. 캡슐화에는 객체 구성 방식에 신경 쓸 필요가 없습니다
2. 캡슐화에는 데이터 캡슐화와 함수 캡슐화가 포함됩니다. 데이터 캡슐화는 개인 정보 보호를 위한 것이고, 함수 캡슐화는 복잡성을 격리하기 위한 것입니다
3. a __
class People:def __init__(self,name,age,salary): self.name=name self.age=age self.__salary=salary p=People('zhang',19,100000)print(p.name)#zhangprint(p.age)#19print(p.__salary)#AttributeError: 'People' object has no attribute '__salary'
야, 오류가 보고됐어. 객체의 네임스페이스를 열고 무슨 일이 일어났는지 보자
print(p.__dict__)#{'name': 'zhang', 'age': 19, '_People__salary': 100000}
아, 파이썬이 __salary를 _People__salary로 변환한 것으로 밝혀졌어, 다시 해봐
print(p._People__salary)#100000
그러므로 Python에는 절대 숨김이 없습니다.
이러한 변환 작업은 클래스의 정의 단계 또는 객체 정의(인스턴스화 단계) 단계에서만 발생합니다.
__으로 추가된 외부 속성은 직접 액세스할 수 없지만 클래스 내에서는 액세스할 수 있습니다. 정의 단계에서 __로 시작하는 속성을 만나면 Python 인터프리터가 자동으로 이를 인식하는 것으로 이해할 수 있습니다. _class name__ 속성이므로 클래스 내부에 접근 가능하므로 작은 일을 할 수 있습니다이것을 먼저 살펴보겠습니다class A:def foo(self):print('from A foo') self.bar()def bar(self):print('from A bar')class B(A):def bar(self):print('from B bar') b=B() b.foo() #from A foo
#from B bar 别想多了,调用函数时别看定义位置,要看调用位置부모 클래스의 bar() 함수만 호출하고 싶다면 어떻게 해야 할까요? ? 해야 할 일
class A:def foo(self):print('from A foo') self.__bar()def __bar(self):print('from A bar')class B(A):def __bar(self):print('from B bar') b=B() b.foo() #from A foo#from A bar 有没有感受到编程的享受4. 캡슐화된 애플리케이션1) 우리의 데이터 속성이 어떻게 정의되어 있는지 외부 세계에 공개하지 마세요. 우리가 제공하는 인터페이스를 통해서만 외부 세계에 공개된 내용만 볼 수 있습니다. 2) 더 일반적인 시나리오는 데이터 유형을 제한하고 자체 논리를 추가한 다음 사용자를 위해 캡슐화할 수 있다는 것입니다
class People:def __init__(self,name,age,height,weight,hobby): self.__name=name self.__age=age self.__height=height self.__weight=weight self._hobby=hobbydef tell_info(self):print('''name:%s age:%s height:%s weeight:%s'''%(self.__name,self.__age, self.__height,self.__weight)) p=People('zhang',18,1.90,75,'read') p.tell_info()5. 위의 작업을 보면 사용자는 여전히 p를 확인해야 합니다. name.tell_name()은 원래 데이터 속성이었지만 내장 함수 속성을 사용할 수 있도록 어떻게 위장할 수 있나요
def tell_name(self):print(self.__name)#修改名字def set_name(self,new):if not isinstance(new,str):raise TypeError('名字必须是字符串类型') self.__name=new데이터 속성에도 수정 및 삭제 작업이 있어야 합니다
위 내용은 Python 객체지향 지식 요약의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!