겉바속촉

[PYTHON] 파이썬_객체 지향 이론 본문

IT 일기 (상반기)/PYTHON

[PYTHON] 파이썬_객체 지향 이론

겉바속촉 2021. 1. 7. 16:17
728x90
반응형

 

 

 

안녕하세요

겉바속촉입니다

!^^!

 

 

!!파이썬 시작하기!!

 

 

 

 

이번에는

객체 지향에 대해서 자세하게

알아볼게요

 

지난 번에 여러가지 메서드들을 살펴봤으니깐요!!

 

 

2021/01/07 - [IT 일기 (상반기)/PYTHON] - [PYTHON] 파이썬_객체 지향 프로그래밍

 

[PYTHON] 파이썬_객체 지향 프로그래밍

안녕하세요 겉바속촉입니다 !^^! !!파이썬 시작하기!! 이번에는 객체 지향 프로그래밍에 대해서 알아보도록 하겠습니다 객체 지향 프로그래밍 기본단계 문제 도메인 이해 필요한 타입 알기 타입

2-juhyun-2.tistory.com

 

 

 

 

 


 

 

객체 지향

 

캡슐화

 

  • 데이터와 그 데이터를 사용하는 코드를 한 곳에 넣는다
  • 정확히 어떻게 동작하는 지 상세한 내용은 숨김

 

다형성

 

  • 하나 이상의 형태를 갖는 것
  • 어떤 변수를 포함하는 표현식이 변수가 참조하는 객체의 타입에 따라 서로 다른 일을 하는 것

 

상속

 

  • 새로운 클래스는 부모 클래스(object 클래스 또는 사용자 정의 클래스)의 속성을 상속
  • Faculty 클래스에 __str__ 메서드 확장

 

 

다음 그림을 보시면  class Member 를  Faculty랑 Student가 상속받고 있습니다:)

그리고 상속받은 기능들 뿐만 아니라

자식 클래스는 자신만의 메소드를 또 추가해서 사용할 수 있습니다

 

 


 

 

 

예제

 

 

atom.py

 


class Atom:
    '''번호, 기호, 좌표(x,y,z)를 갖는 원자'''

    def __init__(self, num: int, sym: str, x: float, y: float, z:float) -> None:
        self.num = num
        self.sym = sym
        self.center = (x, y, z)

    def __str__(self) -> str:
        '''(Symbol, X, Y, Z) 형식의 문자열을 반환'''
        return '({}, {}, {}, {})' .format(self.sym, self.center[0], self.center[1], self.center[2])

    def translate(self, x: float, y: float, z: float) -> None:
        self.center = (self.center[0] + x, self.center[1] + y, self.center[2] + z)

 

 

molecule.py

 

from atom import Atom             #위에서 정의한 atom.py 에서 Atom 클래스 사용할 거라고 선언

class Molecule:
    '''이름과 원자 리스트를 갖는 분자 '''

    def __init__(self, name: str) -> None:
        self.name = name
        self.atoms = []

    def add(self, a: Atom) -> None:
        self.atoms.append(a)

    def __str__(self) -> str:
        '''(NAME, (ATOM1, ATOM2, ...)) 형식의 문자열을 반환'''

        atom_list = ''
        for a in self.atoms:
            atom_list = atom_list + str(a) + ', '             #atom.py의 __str__메서드 불러옴

        atom_list = atom_list[:-2]                            #마지막에 추가된 ', ' 문자 제거

        return '({}, ({}))'.format(self.name, atom_list)      #분자식 구하기

    
    def translate(self, x: float, y: float, z: float) -> None:
        for a in self.atoms:
            a.translate(x, y, z)


ammonia = Molecule("AMMONIA")	
ammonia.add(Atom(1, "N", 0.257, -0.363, 0.0))	
ammonia.add(Atom(2, "H", 0.257, 0.727, 0.0))	
ammonia.add(Atom(3, "H", 0.771, -0.727, 0.890))
ammonia.add(Atom(4, "H", 0.771, -0.727, -0.890))
ammonia.translate(0, 0, 0.2)


if ammonia.atoms[0].center[2] == 0.2:
    print('Equal')
else:
    print('Not Equal')

    
# assert ammonia.atoms[0].center[0] == 0.257
# assert ammonia.atoms[0].center[1] == -0.363
# assert ammonia.atoms[0].center[2] == 0.2
# print(repr(ammonia))
print(ammonia)

 

 

 

 

그런데 원자가 너무 많아서

하나하나 대입해서 맞는 지 하기가 힘들쥬?

 

assert라는 것은 단정짓는 다라고 생각하면 됩니다:)

마치 exit와 같은 기능처럼 assert 문장이 맞지 않으면 그 아래 코드로 넘어가지 않고 멈추는 것입니다

 

 

그래서 다음과 같이 코드 바꿔주기

from atom import Atom

class Molecule:
    ''' 이름과 원자 리스트를 갖는 분자 '''

    def __init__(self, name: str) -> None:
        self.name = name
        self.atoms = []

    def add(self, a: Atom) -> None:
        self.atoms.append(a)

    def __str__(self) -> str:
        '''(NAME, (ATOM1, ATOM2, ...)) 형식의 문자열을 반환'''

        atom_list = ''
        for a in self.atoms:
            atom_list = atom_list + str(a) + ', '
        
        atom_list = atom_list[:-2]      # 마지막에 추가된 ', ' 문자를 제거

        return '({}, ({}))'.format(self.name, atom_list)

    def translate(self, x: float, y: float, z: float) -> None:
        for a in self.atoms:
            a.translate(x, y, z)


ammonia = Molecule("AMMONIA")
ammonia.add(Atom(1, "N", 0.257, -0.363, 0.0))
ammonia.add(Atom(2, "H", 0.257, 0.727, 0.0))
ammonia.add(Atom(3, "H", 0.771, -0.727, 0.890))
ammonia.add(Atom(4, "H", 0.771, -0.727, -0.890))
ammonia.translate(0, 0, 0.2)



#assert ammonia.atoms[0].center[0] == 0.257
#assert ammonia.atoms[0].center[1] == -0.363

assert ammonia.atoms[0].center[2] == 0.2

print(ammonia)

 

 

 

728x90
반응형