완숙의 블로그

[Python] 13 - 클래스 (Class) 본문

Programing Language/Python

[Python] 13 - 클래스 (Class)

완숙 2019. 6. 14. 19:29

Class

클래스는 c++에서 자세히 다뤘으므로,

해당 내용에 대해 파이썬 문법만 알아보도록 하자.

 

__init__, constructor

class Student:
    def __init__(self, givenID, givenName):
        self.id = givenID
        self.name = givenName

    def setId(self, givenID):
        self.id = givenID

    def getId(self):
        return self.id

    def setName(self, givenName):
        self.name = givenName

    def getName(self):
        return self.name
    
student1 = Student(20190001, "Harry Potter")
student2 = Student(20190002, "Hermione Granger")

print(student1.getId())
print(student1.getName())

print(student2.getId())
print(student2.getName())  

 

20190001
Harry Potter
20190002
Hermione Granger

 

 

__str__()

기본적으로 내가 만든 클래스의 모든 내용을 알아볼 수 있게

관용적으로 만들어주는 함수이다.

 

class Student:
    def __init__(self, givenID, givenName):
        self.id = givenID
        self.name = givenName

    def setId(self, givenID):
        self.id = givenID

    def getId(self):
        return self.id

    def setName(self, givenName):
        self.name = givenName

    def getName(self):
        return self.name

    def __str__(self):
        msg = "id:{}, name:{}".format(self.id, self.name)
        return msg
    
student1 = Student(20190001, "Harry Potter")
student2 = Student(20190002, "Hermione Granger")

print(student1.getId())
print(student1.getName())

print(student2.getId())
print(student2.getName())  
20190001
Harry Potter
20190002
Hermione Granger
id:20190002, name:Hermione Granger

 

 

 

클래스 변수

class Student:
    # Class variables
    countStudent = 0

    def __init__(self, givenID, givenName):
        # Instance (or Object) variables
        self.id = givenID
        self.name = givenName
        Student.countStudent = Student.countStudent + 1

    def setId(self, givenID):
        self.id = givenID

    def getId(self):
        return self.id

    def setName(self, givenName):
        self.name = givenName

    def getName(self):
        return self.name

    def __str__(self):
        msg = "id:{}, name:{}".format(self.id, self.name)
        return msg

    def getNumOfStudent():
        return Student.countStudent
print(Student.getNumOfStudent())

student1 = Student(20190001, "Harry Potter")
student2 = Student(20190002, "Hermione Granger")

print(student1)
print(student2)  

print(Student.getNumOfStudent())
20190001
Harry Potter
20190002
Hermione Granger
id:20190002, name:Hermione Granger
2
2

 

 

Private Attribute

클래스를 설계할 때, 사람이 변수에 접근하는데 있어서

직접적인 접근을 막고 싶다! 이 때 c++ 에서는 private 를 사용했는데,

여기서는 좀더 직관적으로 변수에 __ 를 추가해주면 된다.

 

class Student:
    # Class variables
    __countStudent = 0

    def __init__(self, givenID, givenName):
        # Instance (or Object) variables
        self.__id = givenID
        self.__name = givenName
        Student.__countStudent = Student.__countStudent + 1

    def setId(self, givenID):
        self.__id = givenID

    def getId(self):
        return self.__id

    def setName(self, givenName):
        self.__name = givenName

    def getName(self):
        return self.__name

    def __str__(self):
        msg = "id:{}, name:{}".format(self.__id, self.__name)
        return msg

    def getNumOfStudent():
        return Student.__countStudent
student1 = Student(20190001, "Harry Potter")
student2 = Student(20190002, "Hermione Granger")

print(student1.getId())
print(student1.getName())

print(student2.getId())
print(student2.getName())  

print(student2.__str__())  

print(Student.getNumOfStudent())
print(Student.getNumOfStudent())

print(Student.__countStudent)
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-15-949f5d70643a> in <module>
     43 print(Student.getNumOfStudent())
     44 
---> 45 print(Student.__countStudent)

AttributeError: type object 'Student' has no attribute '__countStudent'

 

내가 직접적으로 __countStudent 에 접근했기 때문에 에러가 뜬다.

 

 

상속

상속받는 방법을 알아보자!

 

class GraduatedStudent(Student):

    def __init__(self, givenId, givenName, givenYear):
        self.__graduatedYear = givenYear
        super().__init__(givenId, givenName)

    def __str__(self):
        msg = super().__str__() + ", graduation:{}".format(self.__graduatedYear)
        return msg
    
student1 = GraduatedStudent(20190001, "Harry Potter", 2023)

print(student1)
id:20190001, name:Harry Potter, graduation:2023

 

super() 함수가 굉장히 신기한데,

바로 상속받은 클래스에 접근할 수 있는 메서드이다.

 

 

has-a Relationship

특정 클래스를 포함하는 클래스가 있을 수 있다.

부모자식 관계처럼 피를 나누지는 않아도 묶어놓을 수는 있다.

 

class Department:
    def __init__(self):
        memberStudent = Student()

 

memberStudent 를 __init__ 함수안에 변수로 선언해주면 된다.

Comments