파 이 썬 - 대상 프로 그래 밍
프로 그래 밍 모드:
프로 그래 밍 은 프로그래머 가 특정한 문법 + 데이터 구조 + 알고리즘 으로 구 성 된 코드 로 컴퓨터 가 임 무 를 수행 하 는 과정 을 알려 주 는 것 이다. 한 프로그램 은 프로그래머 가 하나의 임무 결 과 를 얻 기 위해 작성 한 명령 의 집합 이다. 이른바 하나의 큰 길 은 로마 로 통 하고 하나의 임 무 를 실현 하 는 방식 은 여러 가지 다른 방식 이 있다.이러한 서로 다른 프로 그래 밍 방식 의 특징 을 귀납 하여 정리 한 프로 그래 밍 방식 의 유형 은 바로 프로 그래 밍 모델 이다.서로 다른 프로 그래 밍 패 러 다 임 은 본질 적 으로 각종 유형의 임무 에 대해 서로 다른 문 제 를 해결 하 는 방향 을 대표 한다. 대부분 언어 는 하나의 프로 그래 밍 패 러 다 임 만 지원 한다. 물론 일부 언어 는 여러 가지 프로 그래 밍 패 러 다 임 을 동시에 지원 할 수 있다.두 가지 가장 중요 한 프로 그래 밍 모델 은 프로 세 스 프로 그래 밍 과 대상 프로 그래 밍 이다.
프로 세 스 지향:
프로그램 이 위 에서 아래로, 위 에서 아래로, 처음부터 끝까지 문 제 를 해결 하 는 것 이다.기본 적 인 디자인 방향 은 프로그램 이 처음에 큰 문 제 를 해결 한 다음 에 큰 문 제 를 여러 개의 작은 문제 나 서브 과정 으로 분해 하 는 것 이다. 이런 서브 과정 을 다시 집행 하 는 과정 은 작은 문제 가 작은 단계 에서 해결 할 수 있 을 정도 로 간단 할 때 까지 계속 분해 하 는 것 이다.구체 적 으로 말 하면 하나의 큰 프로그램 은 기능 에 따라 몇 개의 파일 로 나 눌 수 있 고 모든 파일 은 주 함 수 를 제외 하고 몇 개의 함 수 를 밀봉 할 수 있 으 며 모든 함수 이론 적 으로 가장 작은 기능 단원 이다.
대상 지향:
대상 을 대상 으로 프로 그래 밍 하 는 것 은 '클래스' 와 '대상' 을 이용 하여 각종 모델 을 만들어 실제 세계 에 대한 묘 사 를 실현 하 는 것 이다. 대상 을 대상 으로 프로 그래 밍 하 는 이 유 는 한편, 프로그램의 유지 와 확장 을 더욱 간단 하 게 하고 프로그램 개발 효율 을 크게 높 일 수 있 기 때문이다. 또한,대상 을 대상 으로 하 는 프로그램 을 바탕 으로 코드 논 리 를 쉽게 이해 하고 팀 개발 을 여 유 롭 게 할 수 있 습 니 다.대상 을 대상 으로 복잡 한 임 무 를 처리 하기에 적합 하고 끊임없이 교체 하고 유지 하 는 데 편리 하 다.
어떤 형식 으로 프로 그래 밍 을 하 든 기억 해 야 한다.
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. 구조 함수 와 분석 함수
예 를 들 어 대상 을 만 들 때 속성의 초기 값 을 확인 해 야 합 니 다. 물론 당신 이 하고 싶 은 모든 일 을 할 수 있 습 니 다.
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
알 아야 할 것 은 대상 이 변 수 를 사용 할 때 대상 메모리 에서 먼저 찾 고 존재 하지 않 으 면 클래스 변수 에서 찾 는 것 이다.
클래스 변수의 접근: 대상 을 통 해 클래스 변 수 를 방문 할 때 클래스 의 메모리 에 있 는 변 수 를 방문 합 니 다.
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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.