|
|
01
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | # main.py import mylib1 def main(): p1 = mylib1.Point(5, 5) p2 = mylib1.Point3D(5, 5, 5) print(p1) print(p2) if __name__ == "__main__": main() # mylib.py class Point: def __init__(self, x, y): self.x = x self.y = y def __str__(self): return f"({self.x}, {self.y})" class Point3D(Point): def __init__(self, x, y, z): super().__init__(x, y) self.z = z def __str__(self): return f"({self.x}, {self.y}, {self.z})" | cs |
02
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | # main.py import mylib2 def main(): c = mylib2.Contact("1234", "Gunsan", "dh", "dh@email.com", "1234-1234") print(c) if __name__ == "__main__": main() # mylib.py class Address: def __init__(self, street, city): self.street = str(street) self.city = str(city) class Person: def __init__(self, name, email): self.name = str(name) self.email = str(email) class Contact(Address, Person): def __init__(self, street, city, name, email, contact): Address.__init__(self, street, city) Person.__init__(self, name, email) self.contact = contact def __str__(self): return f"{self.street}, {self.city}, {self.name}, {self.email}, {self.contact}" | cs |
03
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | # main.py import mylib3 def main(): q = mylib3.Quadratic(1, 1, -6) print(q.get_roots()) print(q.value(1)) if __name__ == "__main__": main() # mylib.py class Function: def value(self, x): pass class Quadratic(Function): def __init__(self, a, b, c): self.a = a self.b = b self.c = c def value(self, x): return self.a * x**2 + self.b * x + self.c def get_roots(self): a = self.a b = self.b c = self.c result1 = (-b + (b**2 - 4*a*c)**0.5) / (2*a) result2 = (-b - (b**2 - 4*a*c)**0.5) / (2*a) return (result1, result2) | cs |
04
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | # main.py import mylib4 def main(): d = mylib4.Dice() fd = mylib4.FraudDice() d.roll() fd.roll(3) if __name__ == "__main__": main() # mylib.py import random class Dice: def __init__(self): pass def roll(self): print("Dice.roll()") print(random.randint(1, 6)) class FraudDice(Dice): def __init__(self): pass def roll(self, x): print(f"FraudDice.roll() x = {x}") while (True): cmp = random.randint(1, 6) print (cmp) if (cmp == x): break | cs |
05
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | # main.py from mylib5 import* def main(): c1 = Cat("a", 8, "aa") c2 = Cat("b", 5, "bb") c3 = Cat("c", 1, "cc") r= get_oldest_cat(c1, c2, c3) print(f"가장 많은 나이 : {r}살") if __name__ == "__main__": main() # mylib.py class Animal: pass class Cat(Animal): def __init__(self, name, age, breed): self.name = name self.age = age self.breed = breed def get_oldest_cat(*args): age_list = [] for i in args: age_list.append(i.age) return max(age_list) | cs |
06
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | # main.py from mylib6 import* def main(): dept = Department("컴퓨터") math1 = dept.add_course("공업수학", 3) math2 = dept.add_course("이산수학", 2) kim = Student("Kim", 20200001) kim.enroll(math1) kim.enroll(math2) print(dept) print(kim) if __name__ == "__main__": main() # mylib.py class Department: def __init__(self, name): self.name = name self.course = {} def add_course(self, name, credit): self.course[name] = credit return name def __str__(self): return f"Dept: {self.name}\ncourse: {self.course}" class Student: def __init__(self, name, id): self.name = name self.id = id self.courses = [] def enroll(self, subject): self.courses.append(subject) def __str__(self): return f"name: {self.name}({self.id}), courses: {self.courses}" | cs |
07
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | # main.py from mylib7 import* def main(): lee = Artist("Lee's band") album = Album("첫번째앨범", lee, 2020) album.add_track("첫번째노래") album.add_track("두번째노래") playlist = Playlist("애창곡") for song in album.tracks: playlist.add_song(song) print(album) print(playlist) if __name__ == "__main__": main() # mylib.py class Artist: def __init__(self, name): self.name = name class Album: def __init__(self, album_name, artist, year): self.album_name = album_name self.name = artist.name self.year = year self.tracks = [] def add_track(self, name): self.tracks.append(name) def __str__(self): return f"{self.album_name}\n{self.name}\n{self.year}\n{self.tracks}" class Playlist: def __init__(self, name): self.name = name self.songs = [] def add_song(self, name): self.songs.append(name) def __str__(self): return f"Playlist name:{self.name}\nsongs:{self.songs}" | cs |
-------------------------------------
- 부모 클래스의 메서드를 자식 클래스에서 오버라이딩하는 방법
1) super() 함수 사용
: super() 함수는 MRO(Method Resolution Order, 메서드 결정 순서)를 따르며, 다중 상속에서도 올바르게 동작한다.
2) 부모 클래스를 직접 호출
:부모 클래스 이름을 직접 사용하면, MRO를 무시하고 명시적으로 특정 부모 클래스의 메서드를 호출한다.
- MRO(Method Resolution Order, 메서드 결정 순서)
: MRO는 파이썬에서 특정 메서드를 호출할 때 어떤 순서로 클래스를 탐색하는지 결정하는 규칙이다.
특히 다중 상속에서 중요한 역할을 하며, C3 선형화(C3 Linearization) 알고리즘을 기반으로 동작한다.
- C3 선형화
: C3 선형화는 파이썬에서 다중 상속시 MRO를 정하는 알고리즘이다. C3 선형화를 이용해 다음과 같은 문제를 해결할 수 있다.
1. 어떤 부모 클래스의 메서드를 먼저 호출하는가
2. 중복 호출을 어떻게 피할것인가
3. 상속과 메서드 오버라이딩 하는데 있어 일관된 순서를 유지할 수 있는가
- C3 선형화는 이를 해결하기 위해 다음과 같은 원칙을 따른다
1. 하위 클래스가 상위 클래스보다 먼저 나온다.
2. 왼쪽에서 오른쪽으로 정의된 순서를 따른다.
3. 클래스는 한 번만 포함된다. (중복 방지)
4. 모든 부모 클래스가 포함된 후에만 상속 관계에서 자식 클래스를 추가할 수 있다.
- super() 함수에서 MRO에 따른 동작 확인
1. D.show() 가 호출되면, super().show()는 B.show()로 넘어간다
2. B.show() 가 호출되면, super().show()는 C.show()로 넘어간다.
B의 부모 클래스는 A이지만 C로 넘어가는 이유는 MRO에서 B의 다음 클래스는 C이기 때문이다.
3, C.show()가 호출되면, super().show()는 A.show()로 넘어간다.
=> super() 는 부모 클래스 메서드를 직접 호출하는 것이 아니라, 현재 클래스의 MRO에서 super()가 호출될 때 어떤 클래스의 메서드를 호출할지를 정한다.
----------------------------------------
- 파이썬에서 클래스 생성시 따로 작성하지 않아도 사용할 수 있는 메서드와 속성
: 파이썬의 클래스는 따로 작성하지 않아도 기본적으로 'object' 클래스를 상속받는다. 따라서 object 클래스 안에 있는 메서드와 속성 또한 따로 작성하지 않고 사용할 수 있다.
__class__ 속성은 자기 자신의 자료형을 가리킨다.
------------------------------------------------
파이썬에서 self 란?
: self 는 인스턴스 자신을 가리키는 변수.
매서드는 무조건 첫 번째 인자로 자기 자신(인스턴스)을 자동 전달하기 때문에 self 를 쓰지 않으면 오류가 발생한다.
실제 동작 -> Person.say_hi(p1)
self 는 파이썬이 미리 정의해 둔 키워드인가?
: self 는 일반 변수이다. 파이썬이 미리 정의해 둔 특별한 키워드 같은 건 아니다. 단순히 메서드를 작성할 때 관습적(convention)으로 첫 번째 매개변수의 이름을 self 라고 하는 것이다.(약속된 이름)
실제로 메서드를 작성할 때 self 가 아닌 다른 이름의 변수를 넣어도 정상적으로 작동한다.
결론: self는 그냥 일반 변수이다.
|
|

첫댓글 파이썬 클래스 작성시 자동으로 생성되는 멤버변수에 대하여 조사하라
그중에서 자료형을 저장하는 변수는 무엇인가?
그중에서 자신을 가리키는 변수는 무엇인가?
내용 추가하였습니다.