>백엔드 개발 >파이썬 튜토리얼 >Python 객체지향 지식 요약

Python 객체지향 지식 요약

巴扎黑
巴扎黑원래의
2017-07-23 13:44:411835검색

캡슐화

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

데이터 속성에도 수정 및 삭제 작업이 있어야 합니다
rreee

위 내용은 Python 객체지향 지식 요약의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.