파 이 썬 - 대상 프로 그래 밍

12699 단어
1. 대상 지향 or 과정 지향?
프로 그래 밍 모드:
프로 그래 밍 은 프로그래머 가 특정한 문법 + 데이터 구조 + 알고리즘 으로 구 성 된 코드 로 컴퓨터 가 임 무 를 수행 하 는 과정 을 알려 주 는 것 이다. 한 프로그램 은 프로그래머 가 하나의 임무 결 과 를 얻 기 위해 작성 한 명령 의 집합 이다. 이른바 하나의 큰 길 은 로마 로 통 하고 하나의 임 무 를 실현 하 는 방식 은 여러 가지 다른 방식 이 있다.이러한 서로 다른 프로 그래 밍 방식 의 특징 을 귀납 하여 정리 한 프로 그래 밍 방식 의 유형 은 바로 프로 그래 밍 모델 이다.서로 다른 프로 그래 밍 패 러 다 임 은 본질 적 으로 각종 유형의 임무 에 대해 서로 다른 문 제 를 해결 하 는 방향 을 대표 한다. 대부분 언어 는 하나의 프로 그래 밍 패 러 다 임 만 지원 한다. 물론 일부 언어 는 여러 가지 프로 그래 밍 패 러 다 임 을 동시에 지원 할 수 있다.두 가지 가장 중요 한 프로 그래 밍 모델 은 프로 세 스 프로 그래 밍 과 대상 프로 그래 밍 이다.
프로 세 스 지향:
프로그램 이 위 에서 아래로, 위 에서 아래로, 처음부터 끝까지 문 제 를 해결 하 는 것 이다.기본 적 인 디자인 방향 은 프로그램 이 처음에 큰 문 제 를 해결 한 다음 에 큰 문 제 를 여러 개의 작은 문제 나 서브 과정 으로 분해 하 는 것 이다. 이런 서브 과정 을 다시 집행 하 는 과정 은 작은 문제 가 작은 단계 에서 해결 할 수 있 을 정도 로 간단 할 때 까지 계속 분해 하 는 것 이다.구체 적 으로 말 하면 하나의 큰 프로그램 은 기능 에 따라 몇 개의 파일 로 나 눌 수 있 고 모든 파일 은 주 함 수 를 제외 하고 몇 개의 함 수 를 밀봉 할 수 있 으 며 모든 함수 이론 적 으로 가장 작은 기능 단원 이다.
대상 지향:
대상 을 대상 으로 프로 그래 밍 하 는 것 은 '클래스' 와 '대상' 을 이용 하여 각종 모델 을 만들어 실제 세계 에 대한 묘 사 를 실현 하 는 것 이다. 대상 을 대상 으로 프로 그래 밍 하 는 이 유 는 한편, 프로그램의 유지 와 확장 을 더욱 간단 하 게 하고 프로그램 개발 효율 을 크게 높 일 수 있 기 때문이다. 또한,대상 을 대상 으로 하 는 프로그램 을 바탕 으로 코드 논 리 를 쉽게 이해 하고 팀 개발 을 여 유 롭 게 할 수 있 습 니 다.대상 을 대상 으로 복잡 한 임 무 를 처리 하기에 적합 하고 끊임없이 교체 하고 유지 하 는 데 편리 하 다.
어떤 형식 으로 프로 그래 밍 을 하 든 기억 해 야 한다.
1. 중복 코드 를 쓰 는 것 은 매우 나 쁜 저급한 행동 이다.
2. 이미 작 성 된 코드 는 자주 변경 해 야 합 니 다.
2. 대상 에 대한 소개
"세상 만물 은 모두 대상 이 고 세상 만물 은 모두 분류 할 수 있다."여기 서 는 대상 과 유형의 개념 을 이해 해 야 한다.
대상 이 라면 반드시 어떤 종류 에 속한다.대상 이 라면 반드시 속성 이 있다.
클래스 (class): 하나의 클래스 는 같은 속성 을 가 진 대상 에 대한 추상 적 인 것 으로 클래스 에서 이 대상 들 이 모두 가지 고 있 는 똑 같은 속성 과 방법 (기능) 을 정의 합 니 다.유형 은 틀 에 해당 한다.
대상 (object): 구체 적 인 사물, 예 를 들 어 한 사람, 나무 한 그루 등.
  • 세 가지 특성: 포장, 계승, 다 형
  • 패 키 징: 클래스 에서 데이터 에 대한 할당, 내부 호출 은 외부 에 보이 지 않 습 니 다 (접근 할 수 없습니다). 이 는 클래스 와 대상 을 캡슐 이나 용기 로 만 들 었 고 그 안에 데이터 와 방법 이 포함 되 어 있 습 니 다.
    계승: 한 종 류 는 자 류 를 파생 시 킬 수 있 으 며, 부 류 중의 속성 방법 은 자동 으로 피 자 류 에 의 해 계승 된다.
    다 중: 한 마디 로 "하나의 인터페이스, 여러 가지 실현" 이 라 고 설명 합 니 다.한 부류 가 여러 개의 자 류 를 파생 시 켰 고 모든 자 류 는 같은 방법 명 을 계승 하 는 동시에 부류 의 방법 에 대해 서로 다른 실현 을 했다. 이것 은 같은 사물 의 여러 형태 이다.서로 다른 대상 에 게 같은 메 시 지 를 보 내 면 다른 행동 을 할 수 있다.
    우 리 는 아래 에서 이 세 가지 특성 을 천천히 체득 할 것 이다.
    3. 실례 화
    하나의 종 류 를 구체 적 인 대상 으로 바 꾸 는 과정 을 실례 화 라 고 한다.어떻게 실례 화 합 니까?파 이 썬 의 구성 에 대해 알 아 봐 야 합 니 다.
    이전 코드
     1 class Role(object):
     2     n=123 #    
     3     m=[1,2,3,4,5]
     4     def __init__(self, name, role, weapon, life_value=100, money=15000):
     5         "    "
     6         '''             '''
     7         self.name = name  #       ,   r1.name=name
     8         self.role = role  #     (    ) ,   :     
     9         self.weapon = weapon
    10         self.life_value = life_value
    11         self.money = money
    12         
    13     def __del__(self):
    14         "    "
    15         print("alreadly death")
    16         
    17     def shot(self):  #     (  )(    )
    18         print("shooting...")
    19 
    20     def got_shot(self):
    21         print("ah...,I got shot...")
    22 
    23     def buy_gun(self, gun_name):
    24         print("just bought %s" % gun_name)
    25 
    26 
    27 r1 = Role('Alex', 'police',' AK47')   #      
    28 r2 = Role('Jack', 'terrorist', 'B22')
    29 r1.buy_gun("Alex")
    30 r1.got_shot() #         ,        r1,            r1
    31                #     r1 = Role.got_shor(r1)
    

    1. 속성 과 방법
    속성, 즉 클래스 에 포 장 된 변수 입 니 다.방법 은 클래스 에 포 장 된 일정한 기능 을 가 진 함수 입 니 다.
    예 를 들 어 name, role, weapon 등 은 모두 속성 이다.shot,got_shot,buy_건 등 이 다 방법 이 야.
    2. 구조 함수 와 분석 함수
  • __init__구조 함수 나 구조 방법 이 라 고 불 린 다.그것 의 역할 은 클래스 가 예화 되 었 을 때 대상 에 게 메모 리 를 열 어 초기 화 작업 을 하 는 것 이다.

  • 예 를 들 어 대상 을 만 들 때 속성의 초기 값 을 확인 해 야 합 니 다. 물론 당신 이 하고 싶 은 모든 일 을 할 수 있 습 니 다.
  • __del__석조 함수 라 고 불 린 다.그것 의 역할 은 대상 을 소각 할 때 마 무 리 를 하 는 것 이다.이 작업 들 은 함 수 를 추가 로 호출 할 필요 가 없습니다. 소각 할 때 자동 으로 실 행 됩 니 다.

  • 3. 클래스 변수 와 인 스 턴 스 변수
    실례 화 과정 후 대상 에 상응하는 속성 값 이 생 겼 지만 상응하는 방법 이 없고 방법 은 클래스 에 있다.대상 호출 방법 은 클래스 에서 호출 됩 니 다.그렇다면 어떤 대상 이 이 방법 을 사용 하고 있 는 지 어떻게 구분 해 야 할 까?
    self, 신분 식별 에 해당 합 니 다.클래스 에서 self 가 대표 하 는 것 은 인 스 턴 스 자체 입 니 다.
  • 인 스 턴 스 변수
  • r1.name="lwz"
    print(r1.name) #      
    r2.name="lilan"
    print(r2.name)
    
    r1.bullt_prove=" new bianliang"  #         ,           
    print(r1.bullt_prove)
    
    print("r1   :",r1.weapon)
    del r1.weapon
     #           
      :
    lwz
    lilan
    new bianliang
    r1   :  AK47
    
  • 클래스 변수
  • 클래스 의 변 수 는 클래스 변수 라 고 하고 대상 을 생 성 한 후에 대상 내 에서 인 스 턴 스 변수 라 고 합 니 다.그러나 구조 함수 의 외부 에서 우 리 는 그것 을 클래스 변수 라 고 부른다.예 에서 n 과 m 는 모두 클래스 변수 입 니 다.
    알 아야 할 것 은 대상 이 변 수 를 사용 할 때 대상 메모리 에서 먼저 찾 고 존재 하지 않 으 면 클래스 변수 에서 찾 는 것 이다.
    클래스 변수의 접근: 대상 을 통 해 클래스 변 수 를 방문 할 때 클래스 의 메모리 에 있 는 변 수 를 방문 합 니 다.
    print(Role.n) #             
    print(r1.name,r1.n) #              
    print(r2.name,r2.n)
      :
    123
    lwz 123
    lilan 123
    

    대상 을 통 해 클래스 변 수 를 수정 할 때 실제 변 수 는 클래스 변수 가 아니 라 현재 대상 에서 동명 변 수 를 새로 생 성 했 습 니 다 (생각해 보 세 요)
    r1.n="    "            #      r1      
    print("  r1  ",r1.n)   #           r1      
    print("  r2  ",r2.n)   #        
    print("   ",Role.n)     #        
    print()
    
    Role.n="ABC" #         
    print("   ",Role.n)    #         
    print("  r1  ",r1.n)  # n r1        ,    
    print("  r2  ",r2.n)  # r2         
    
    print("   Role.m",Role.m)
    r1.m.append("from r1")
    r2.m.append("from r2")
    print("   r1",r1.m)
    print("   r2",r2.m)
    print("   Role.m",Role.m)
    #        ,          
      :
    
      r1       
      r2   123
        123
    
        ABC
      r1       
      r2   ABC
       Role.m [1, 2, 3, 4, 5]
       r1 [1, 2, 3, 4, 5, 'from r1', 'from r2']
       r2 [1, 2, 3, 4, 5, 'from r1', 'from r2']
       Role.m [1, 2, 3, 4, 5, 'from r1', 'from r2']
    alreadly death
    alreadly death
    

    클래스 변수 와 인 스 턴 스 변수 요약:
    1. 간단 한 데이터 형식: 대상 을 통 해 수정 하면 인 스 턴 스 변 수 는 대상 메모리 에 있 고 클래스 변수 와 무관 합 니 다.
    2. 복잡 한 데이터 형식 (목록 등): 대상 에서 수정 하면 대상 에서 변 수 를 만 들 지 않 고 클래스 의 변 수 를 수정 합 니 다.모든 대상 공용 클래스 의 클래스 변수 입 니 다.
    이 예 는 대상 을 대상 으로 하 는 첫 번 째 기본 적 인 특성 을 나타 내 고 포장 하 는 것 이다. 사실은 구조 방법 으로 내용 을 특정한 구체 적 인 대상 에 밀봉 한 다음 에 대상 을 통 해 직접 또는 self 를 통 해 봉 인 된 내용 을 간접 적 으로 얻 는 것 이다.
    4. 유형의 계승 (신식 류 와 고전 류)
    상속
    1 # class People:     
     2 class People(object):  #    ,             ,              
     3 
     4     def __init__(self,name,age,height):
     5         self.name = name
     6         self.age = age
     7         self.height = height
     8 
     9     def eat(self):
    10         print("{0} is eating".format(self.name))
    11 
    12     def talk(self):
    13         print("{0} can speak".format(self.name))
    14 
    15     def sleep(self):
    16         print("{0} is sleeping".format(self.name))
    17 
    18 
    19 '''Python     ,          
    20 '''
    21 class Relation(object):
    22     def makefriend(self,obj):
    23         print("{0} is making friends with {1}".format(self.name,obj.name))
    24 
    25 
    26 class man(People,Relation):
    27     "Man    People "
    28     '''            ,    init  ,               init   '''
    29     '''        ,       man  init       ,    super         init'''
    30     def __init__(self,name,age,height,money):
    31         People.__init__(self,name,age,height)           #                           
    32        #super(man, self).__init__(name, age, height)    #                         
    33         '''        ,   People     ,       '''
    34         self.money = money      #       
    35         print("{0}     {1} ".format(self.name,self.money))
    36 
    37     def piao(self):
    38         print("woo~!@#¥%…&*")
    39 
    40     def sleep(self):
    41         super().sleep() #        ,        
    42             #       ,                 ,         
    43         print("new sleeping")
    44 
    45 
    46 class woman(People,Relation):
    47     "  "
    48     '''           ,              '''
    49     '''      ,              People --> Relation '''
    50     def bring(self):
    51         print("{0} is born a baby".format(self.name))
    52 
    53 
    54 print("man:")
    55 m1 = man("Alex",20,170,150) #              
    56 print(m1.age)
    57 m1.eat()   #       
    58 m1.piao()  #       
    59 m1.sleep()
    60 
    61 print("woman:")
    62 w1 = woman("Jack",24,160)
    63 m1.makefriend(w1) #     
    64 w1.bring()
    65 
    66 '''             '''
    67 
    68 '''
    69        :
    70 man、woman    ,      ,   People   ,    Relation。
    71 '''
    72   :
    73 man:
    74 Alex     150 
    75 20
    76 Alex is eating
    77 woo~!@#¥%…&*
    78 Alex is sleeping
    79 new sleeping
    80 woman:
    81 Alex is making friends with Jack
    82 Jack is born a baby
    

    구조 방법 과 일반적인 방법의 재 구성 에 대해 상기 코드 의 주석 은 이미 매우 명확 하 다.
    하지만 주의 하 세 요!파 이 썬 은 다 상속 을 지원 하지만 실제 사용 에 서 는 다 상속 을 최대한 사용 하지 않 는 다.저 는 Python 3.6.5 에서 신식 류 와 고전 류 의 3 세대 다 상속 을 테스트 하고 다 상속 의 방법 을 모색 한 후에 동료 와 2 세대 다 상속 을 교 류 했 습 니 다. 서로 다른 계승 조건 에서 의 계승 전략 이 다른 bug 를 발 견 했 습 니 다. 매우 혼 란 스 럽 고 깊이 연구 하지 않 았 습 니 다.
    5. 신식 류 와 고전 류
    (오락 만! Python 이 많이 계승 하 는 bug 를 발 견 했 기 때문에 더 이상 깊이 연구 하지 않 았 습 니 다. 그래서 여 기 는 제 테스트 코드 만 보 여 주 었 습 니 다. 참고 하 시기 바 랍 니 다. 나중에 2 세대 가 계승 하 는 코드 를 다시 쓸 수 있 습 니 다. 여기 서 정 리 된 결론 이 뒤 집 힐 것 입 니 다)
    1 '''
     2                        
     3 '''
     4 '''     :     '''
     5 class A():
     6     def __init__(self):
     7         print("A")
     8     def a(self):
     9         print("A  a  ")
    10 class E():
    11     def __init__(self):
    12         print("E")
    13     def a(self):
    14         print("E  a  ")
    15 
    16 class B(E):
    17     pass
    18     #def __init__(self):
    19      #   print("B")
    20 class C(A):
    21     pass
    22     #def __init__(self):
    23      #   print("C")
    24 class L():
    25     def __init__(self):
    26         print("L")
    27     def a(self):
    28         print("L  a  ")
    29 
    30 class D(B,C):
    31     pass
    32     def __init__(self):
    33         L.__init__(self)
    34         print("D")
    35 
    36 print("   ")
    37 d = D() #       ,D               B   
    38 d.a()
    39 #   B      ,  C 
    40 # D   E。
    41 '''
    42   :
    43 A -> C(   ) -> D 
    44 E -> B(   ) -> D  D(B,C)
    45          ,       ,                ,         ?
    46      :D  E
    47 '''
    48 '''  :     ,          。
    49                 ,              ,
    50            ,        ,             。'''
    51 
    52 
    53 '''     :     '''
    54 
    55 class X(object):
    56     def __init__(self):
    57         print("X")
    58     def a(self):
    59         print("X    a")
    60 class Y(object):
    61     def __init__(self):
    62         print("Y")
    63 
    64 class Z(X):
    65     pass
    66     #def __init__(self):
    67      #   print("Z")
    68 class Q(Y):
    69     def __init__(self):
    70         print("Q")
    71     def a(self):
    72         print("Q    a")
    73 
    74 class P(object):
    75     def __init__(self):
    76         print("P")
    77     def a(self):
    78         print("P  a  ")
    79 class T(Z,Q):
    80     pass
    81     #def __init__(self):
    82     #    print("T")
    83 
    84 print("   ")
    85 t = T()
    86 t.a()
    87 '''
    88   :
    89 X -> Z(   ) -> T
    90 Y -> Q(   ) -> T     T(Z,Q)
    91          ,       , T  Q,       , T  X
    92      :T  X
    93  :        
    94 '''
      :
       
    L
    D
    E  a  
       
    X
    X    a
    

    다 태
    다 태 는 통 일 된 인 터 페 이 스 를 통 해 모든 대상 에 대한 상응하는 방법 을 호출 하 는 것 이다.
    다 형 을 실현 하 는 두 가지 방법 이 있다.
    1. 부모 클래스 내부 (내부 인터페이스 구현):
    class Animal(object):
        def __init__(self, name):  # Constructor of the class
            self.name = name
    
        def talk(self):  # Abstract method, defined by convention only
            raise NotImplementedError("Subclass must implement abstract method")
    
        '''        (  ),    '''
        @staticmethod #     
        def animal_talk(obj):
            obj.talk()
    
    class Cat(Animal):
        def talk(self):
            print('%s:    !' % self.name)
    
    class Dog(Animal):
        def talk(self):
            print('%s:  ! ! !' % self.name)
    
    c1 = Cat("  ")
    d1 = Dog("  ")
      :
            :
      :    !
      :  ! ! !
    

    2. 클래스 의 외부 (외부 인터페이스 구현):
    함수 정의:
    def func(obj):  #     ,    
        obj.talk()
    
    print("        :")
    func(c1) #               
    func(d1)
      :
            :
      :    !
      :  ! ! !
    

     
    다음으로 전송:https://www.cnblogs.com/V587Chinese/p/9053014.html

    좋은 웹페이지 즐겨찾기