연습 42 - Is-A,Has-A,대상과 클래스 - 서투른 법학 파이톤3

5512 단어

연습Is-A,Has-A, 객체 및 클래스


너는 유형과 대상의 차이를 이해해야 한다. 이것은 매우 중요한 개념이다.문제는 유형과 대상 사이에 진정한 차이가 없다는 것이다.그것들은 서로 다른 시점에서 사실은 같은 물건이다. 나는 선종(Zen koan)으로 이 점을 설명할 것이다.

물고기와 연어의 차이는 무엇입니까?


이 문제가 너를 곤혹스럽게 할 수 있니?앉아서 1분 동안 진지하게 생각해 보자. 물고기와 연어는 확실히 차이가 있지만, 그것들은 같은 물건이야, 그렇지?연어는 물고기의 일종이기 때문에 나는 그것들이 별 차이가 없다고 말했다.그러나 연어는 특정 종류의 물고기일 뿐 다른 종류의 물고기와는 틀림없이 다르다.연어는 가자미가 아니라 연어다.그래서 연어와 물고기는 같은 물건이지만 차이가 있다.
대다수의 사람들이 이렇게 진실한 것을 생각하지 않지만, 모두가 직감적으로 이해할 수 있기 때문에 이 문제는 매우 곤혹스럽다.너는 물고기와 연어의 구체적인 차이가 무엇인지 생각할 필요가 없다. 왜냐하면 너는 그것들이 관련이 있다는 것을 알고 있기 때문이다.너는 연어가 일종의 물고기라는 것을 알고 있을 뿐만 아니라, 또 다른 종류의 물고기도 우리는 이해할 필요가 없다.
우리 한 걸음 더 나아가자.만약 네가 물통에 연어 세 마리를 담았다면, 너는 좋은 사람이기 때문에, 그들 세 사람에게 각각 Frank, Joe, Mary라는 이름을 지어주기로 결정했다.지금 이 문제를 생각해 보자.

Mary와 연어의 차이는 무엇입니까?


이것도 매우 이상한 문제다.하지만 물고기나 연어보다 문제가 더 쉬운 것 같아.너는 Mary가 연어라는 것을 알고 있기 때문에 그녀는 정말 다르다. 그녀는 단지 연어의 실례일 뿐이다.Joe와 Frank도 연어의 실례다.내가'실례'라고 말할 때 내가 가리키는 것은 무엇입니까?다른 연어에서 만들어진 것이지만, 지금은 연어의 속성을 지닌 진실한 존재를 대표한다.
이제 골치 아픈 문제로 돌아가자. 물고기는 하나의 종류이고, 연어도 하나의 종류이며, Mary는 하나의 대상이다.몇 초 동안 생각하고, 우리가 뜯어서 네가 이해했는지 아닌지를 보자.
물고기는 하나의 종류로 그것이 진정한 것이 아니라 우리가 비슷한 속성을 가진 실례에 분류하는 단어라는 것을 의미한다. 이해하겠는가?예를 들면 지느러미도 있고 아가미도 있고 물속에 산다. 그래, 그건 물고기일 수도 있어.
아마도 어떤 Ph.D.가 달려와서 말했다. "아니야, 젊은이. 이 물고기는 사실 대서양 연어야. 사람들은 연어라고 부르는 것을 좋아해."이 교수는 단지 좀 더 상세하게 설명했을 뿐, 동시에 '연어' 라는 새로운 종류를 만들었을 뿐, 그것은 좀 더 특별한 속성을 가지고 있다.코가 길고 고기가 연홍색이고 체형이 커서 민물에 살면 맛있어요?그것은 아마도 연어일 것이다.
마지막으로 한 요리사가 달려와서 이 Ph.D.에게 말했다. "아니야, 이 연어를 봐. 나는 그녀를 Mary라고 부른다. 나는 이따가 그녀로 아주 맛있는 회를 만들 거야."이제 너는 Mary라는 연어 실례가 생겼다. 그녀는 실제로 존재한다. 너의 배를 채울 수 있다.그녀는 이미 대상이 되었다.
이제 알았어. Mary는 연어고, 연어는 물고기야.대상은 한 종류이고, 종류는 다른 종류다.

코드 어떻게 써요?


이것은 매우 이상한 개념이지만, 솔직히 말하면, 당신은 새로운 종류를 만들고 사용할 때만 그것을 걱정할 수 있다.나는 너에게 한 물건이 종류인지 대상인지 식별하는 작은 기교를 가르쳐 줄 것이다.
우선, 당신은 두 가지 신호어를 배워야 합니다. "is-a"(네...)하사.대상과 유형의 상호 관계를 표현할 때'is-a'를 사용하세요.대상과 클래스가 서로 인용되는 것을 가리킬 때 "has-a"를 사용하세요.
지금 이 코드들을 한 번 훑어본 다음##??을 주석으로 바꾸어 다음 줄은 is-a나has-a의 관계, 그리고 어떤 관계를 대표하는지 설명한다.나는 코드의 맨 처음에 이미 몇 가지 예시를 열거했으니, 너는 나머지 부분을 완성해야 한다.
기억해라, is-a는 물고기와 연어 간의 관계를 가리키고,has-a는 연어와 아가미의 관계를 가리킨다.
ex42.py
1   ## Animal is-a object (yes, sort of confusing) look at the extra credit( )
2   class Animal(object):
3       pass
4
5   ## ??
6   class Dog(Animal): 
7
8       def __init__(self, name):
9           ## ??
10          self.name = name 
11
12  ## ??
13  class Cat(Animal): 
14
15      def __init__(self, name):
16          ## ??
17          self.name = name 
18
19  ## ??
20  class Person(object): 
21
22      def __init__(self, name):
23          ## ??
24          self.name = name 
25
26          ## Person has-a pet of some kind
27          self.pet = None 
28
29  ## ??
30  class Employee(Person): 
31
32      def __init__(self, name, salary):
33          ## ?? hmm what is this strange magic?
34          super(Employee, self).__init__(name)
35          ## ??
36          self.salary = salary 
37
38  ## ??
39  class Fish(object): 
40      pass    
41      
42  ## ??   
43  class Salmon(Fish): 
44      pass    
45      
46  ## ??   
47  class Halibut(Fish):    
48      pass    
49      
50      
51  ## rover is-a Dog   
52  rover = Dog("Rover")    
53      
54  ## ??   
55  satan = Cat("Satan")    
56      
57  ## ??   
58  mary = Person("Mary")   
59      
60  ## ??   
61  mary.pet = satan    
62      
63  ## ??   
64  frank = Employee("Frank", 120000)
65      
66  ## ??   
67  frank.pet = rover   
68      
69  ## ??   
70  flipper = Fish()    
71      
72  ## ??   
73  crouse = Salmon()   
74      
75  ## ??   
76  harry = Halibut()   

클래스 이름(object) 정보


나는 줄곧 너에게 사용하라고 강요했지만, 왜 이렇게 쓰는지 설명하지 않았다.방금 너는 이미 유형과 대상의 차이를 배웠으니, 지금 나는 너에게 원인을 알려줄 수 있다.내가 진작 너에게 말했더라면, 너는 기절했을 수도 있고, 이 기술을 배우지 못했을 수도 있었기 때문이다.
진정한 원인은 파이썬 초기에 클래스에 대한 정의가 여러 측면에서 심각한 문제가 있었기 때문이다.그들이 이 점을 인정할 때는 이미 너무 늦었기 때문에 어쩔 수 없이, 그들은 이런 문제가 있는 부류를 지지해야 한다.기존의 문제를 해결하기 위해서 그들은'새로운 종류'를 도입해야 한다. 그러면'구류'는 계속 사용할 수 있고 너도 새로운 정확한 종류를 사용할 수 있다.
이것은'류는 곧 대상'이라는 개념을 사용했다.그들은 새 클래스를 만들 때 계승할 수 있도록 소문자 'Object' 라는 단어를 클래스로 사용하기로 결정했다.어지럽죠?하나의 클래스는 다른 클래스에서 계승되고 후자는 하나의 클래스이지만 이름은'object'이다.하지만 클래스를 정의할 때 Object에서 계승해야 한다는 것을 잊지 마세요.
확실히 그렇다.한 단어의 차이는 이 개념을 더욱 이해하기 어려워지게 하고, 나는 어쩔 수 없이 이제야 너에게 말하게 한다.이제 너는'하나는 대상의 종류'라는 개념을 이해해 볼 수 있다. 만약 네가 흥미가 있다면.
그러나 나는 네가 이해하지 말고 아예 낡은 격식과 새로운 격식류의 차이를 완전히 잊어버리도록 건의한다. 파이톤의 종류가 영원히 너에게 (object)를 요구한다고 가정하면 된다. 너의 정신력은 더욱 중요한 문제를 생각해야 한다.

추가 연습

  • 파이톤이 왜 이 이상한 Object라는 종류를 첨가했는지 연구해 보자. 도대체 무슨 의미가 있을까?
  • 한 종류를 대상으로 사용할 수 있습니까?
  • 연습 문제에 animals,fish,그리고people에 함수를 추가하여 일을 하게 한다.함수가 Animal 같은 '베이스 클래스 (base class)' 에서 Dog에서 어떤 차이가 있는지 보자.
  • 다른 사람의 코드를 찾아서 안에 있는 is-a와has-a의 관계를 알아낸다.
  • 목록과 사전을 사용하여 새로운'has-many'쌍을 만듭니다.
  • 당신은'has-many'의 관계가 있다고 생각합니까?'다중 계승(multiple inheritance)'에 대한 자료를 읽고 이런 용법을 최대한 피하세요.

  • FAQ


    (object) 주석들은 무엇을 합니까?이것들은 주석의 빈칸입니다. 거기에 정확한 'is-a' 또는'has-a '개념을 기입해야 합니다.이 연습을 다시 한 번 읽고, 다른 주석을 보면, 너는 나의 뜻을 이해할 수 있을 것이다.## ?? 무슨 의미가 있습니까?이렇게 하면 self.pet = None 이 클래스의 속성이 기본 None으로 설정되어 있는지 확인합니다.self.pet 뭐 하는 사람이에요?이것은 네가 부류를 실행하는 init 방법의 믿을 만한 방식이다."python 3.6 super"를 검색해서 당신에게 유익하고 해로운 여러 가지 조언을 읽어 보세요.

    좋은 웹페이지 즐겨찾기