ํด๋ž˜์Šค๋Š” 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__ ํ•จ์ˆ˜์•ˆ์— ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

Exercise

inputdata1.csv ์™€ inputdata2.csv ๋ฅผ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์•„์„œ sample.csv์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“œ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด๋ผ.

myFile ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์„œ ํ’€์ดํ•ด๋ผ.

inputdata1.csv

ID,Name
20190001,Apple
20190003,Pear
20190002,Orange

inputdata2.csv

ID,Class1,Class2,Class3
20190003,90,90,98
20190002,45,12,37
20190009,10,10,10
20190001,89,92,35

sample.csv

ID,Name,Course 1,Course 2,Course 3,Average
20190001,Apple,89,92,35,72
20190002,Orange,45,12,37,31
20190003,Pear,90,90,98,92

ํ’€์ด

# ANSWER : START
 
import csv
 
class myFile:
 
    def __init__(self, fileName = None, fileMode = None):
        self.__fileName = fileName
        self.__fileMode = fileMode
        self.__fileList = []
        if self.__fileMode == "r" and self.__fileName != None:
            self.file = open(self.__fileName, self.__fileMode)
            read_file = csv.reader(self.file)
            for line in read_file:
                self.__fileList.append(line)
            self.__fileList[1:] = sorted(self.__fileList[1:])
 
        elif self.__fileMode == "w" and self.__fileName != "":
            self.file = open(self.__fileName, self.__fileMode)
 
 
    def getStatus(self):
 
        if self.__fileList != [] or self.__fileMode == "w":
            return True
        else:
            print("ํŒŒ์ผ์ด ์—ด๋ฆฌ์ง€ ์•Š์•˜์Œ status = false")
            return False
 
 
    def getBody(self):
 
        if self.getStatus() == True:
            return self.__fileList[1:]
        else:
            print("ํŒŒ์ผ์ด ์—ด๋ฆฌ์ง€ ์•Š์•„ body ์ถœ๋ ฅ์ด ๋ถˆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.")
            return False
 
    def setContentHead(self,fileHeader = None):
        if self.getStatus() == True and fileHeader != None:
            self.__fileHeader = fileHeader
            return True
        else:
            print("fileHeader ๊ฐ€ ์ฃผ์–ด์ง€์ง€ ์•Š์•˜๊ฑฐ๋‚˜, ํŒŒ์ผ์ด ์—ด๋ฆฌ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.")
            return False
 
 
    def setContentBody(self, fileContent = None):
        if self.getStatus() == True and fileContent != None:
            self.__fileContent = fileContent
            return True
        else:
            print("fileContent ๊ฐ€ ์ฃผ์–ด์ง€์ง€ ์•Š์•˜๊ฑฐ๋‚˜, ํŒŒ์ผ์ด ์—ด๋ฆฌ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.")
            return False
 
    def writeFile(self):
        if self.getStatus() == True:
            myWriter = csv.writer(self.file)
            myWriter.writerow(self.__fileHeader)
            for i in range(len(self.__fileContent)):
                myWriter.writerow(self.__fileContent[i])
            return True
 
        else:
            print("ํŒŒ์ผ์ด ์—ด๋ฆฌ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.")
            return False
 
    def closeFile(self):
        if self.getStatus() == True:
            self.file.close()
            return True
 
        else:
            print("ํŒŒ์ผ์ด ์—ด๋ฆฌ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.")
            return False
 
 
def mergeList(li1, li2):
    result = []
    temp = []
 
    for i in range(len(li1)):
        for j in range(len(li2)):
            if li1[i][0] == li2[j][0]:
                temp = []
                temp.append(li1[i][0])
                temp.append(li1[i][1])
                temp.append(li2[j][1])
                temp.append(li2[j][2])
                temp.append(li2[j][3])
                sum = 0
                for k in range(1,4):
                    sum = sum + int(li2[j][k])
 
                temp.append(str(int(sum/3)))
 
                result.append(temp)
 
    result = sorted(result)
 
    return result
 
 
# ANSWER : END
 
file1 = myFile("inputdata1.csv", 'r')
file2 = myFile("inputdata2.csv", 'r')
 
if (file1.getStatus() != False) and (file2.getStatus() != False):
    newList = mergeList(file1.getBody(), file2.getBody())
 
    file3 = myFile("output.csv", 'w')
    file3.setContentHead(["ID", "Name", "Course 1", "Course 2", "Course 3", "Average"])
    file3.setContentBody(newList)
    file3.writeFile()
    file3.closeFile()
else:
    print("input file error")
 
file1.closeFile()
file2.closeFile()