Python

[python] Class

SangRok Jung 2022. 9. 3. 22:45
반응형

class


객체에서 사용되는 속성과 메서드를 정의한 틀

 

  • 객체  : 클래스로부터 생성되어 클래스의 속성과 메서드를 가진다.
  • 속성 : 클래스와 객체에서 사용되는 변수
  • 메서드 : 클래스와 객체에서 사용되는 함수

 

 

class의 구조

 

 

 

 

 

 

 

▶ 기본 문법

class 클래스명 : 
	클래스 변수 = 값
    
    def 메소드명(self, 매개변수..) :
    	self.인스턴스변수 = 매개변수

 

 

 

 

 

▶ 클래스명을 선언할 때 앞글자는 대문자를 사용한다.

클래스 내에 함수를 선언 할 때는 파라미터 앞에 첫번째 인자값에 self를 넣어야한다.

* self가 꼭 아니더라도 상관없다. 파이썬 자체에서 첫번째 인자값을 자동으로 넘겨주기 때문이다.

class MyClass :
    number = 100
    
    def inc_10(self) :
        MyClass.number += 10 # 클래스 속성
        
    def inc_20(sefl) :
        MyClass.number += 20 # 클래스 속성
        
m1 = MyClass()
m1.inc_10()
m1.inc_10()
print(m1.number)
# 120

m2 = MyClass()
m2.inc_20()
print(m2.number)
#140

 

 

 

 

 

 

 

인스턴스 변수


▶ 인스턴스 변수

각각의 인스턴스마다 갖고 있는 고유한 변수다.

각각의 인스턴스 변수에 접근 할 때에는 self.인스턴스변수명 의 형태로 접근한다.

 

▶ 클래스 변수

클래스 변수는 여러 인스턴스에서 공유해서 사용하는 변수다.

클래스 변수에 접근할 때에는 클래스명. 클래스변수의 형태로 접근한다

클래스 속성과는 다르게 독자적인 속성을 지니고 있다.

class MyClass :

    def one(self, number):
        self.number = number #인스턴스 속성
    
    def inc_10(self) :
        self.number += 10 #인스턴스 속성
        
    def inc_20(self) :
        self.number += 20 #인스턴스 속성
        
m3 = MyClass()
m3.one(100) # 인스턴스 속성에 초기값 선언
m3.inc_10()
print(m3.number)
# 110

m4 = MyClass()
m4.one(1000) # 인스턴스 속성에 초기값 선언
m4.inc_20()
print(m4.number)
# 1020

m5 = MyClass()
m5.one(0)
m5.inc_20()
print(m5.number)
# 20
class Encore : 
    def f(self, a, b) :
        self.a = a
        self.b = b
        
x = Encore()
y = Encore()
x.f(5, 8)
y.f(5, 10)
print(x.a, x.b, y.a, y.b)
# 5 8 5 10

 

 

 

 

 

 

 

Class의 구조


class FourCal() :
    def setData(self, a, b) :
        self.a = a
        self.b = b
        
    def add(self):
        return self.a + self.b
    def mul(self) :
        return self.a * self.b
    def sub(self) :
        return self.a - self.b
    def div(self) : 
        return self.a / self.b
    
a = FourCal()
a.setData(3, 5)
print(a.add())
print(a.mul())
print(a.sub())
print(a.div())

# 8
# 15
# -2
# 0.6

 

 

 

 

 

 

 

 

 

Constructor (생성자)

__init__


  • 객체에 초깃값을 설정한다.
  • 클래스 내 __init__을 선언하면 클래스를 호출 할 때 꼭 매개변수의 값을 전달해 주어야한다.
  • 클래스를 처음에 호출 할 때 들어가는 파라미터안의 값이 인스턴스 변수에 저장된다.

 

class Woman : 
    addr = "서울"
    def __init__(self, name) :
        self.name = name
        
w1 = Woman("영미")
print(w1.name, w1.addr)
# 영미 서울

w2 = Woman("수자")
Woman.addr = "뉴욕"
print(w1.name, w1.addr)
# 영미 뉴욕
class Book : 
    def __init__(self) : 
        self.title = ""
        self.name = ""
    
    def book_info_input(self, name) :
        self.name = name
        
    def book_info_print(self) :
        print(f"{self.title}/{self.name}")
    
    
    
b1 = Book()
b2 = Book()
b1.title = "메밀꽃 필 무렵"
b2.title = "마지막 잎 새"
print("b1.title : ", b1.title)
print("b2.title : ", b2.title)
b1.book_info_input("이효석")
b2.book_info_input("오헨리")
b1.book_info_print()
b2.book_info_print()

# b1.title :  메밀꽃 필 무렵
# b2.title :  마지막 잎 새
# 메밀꽃 필 무렵/이효석
# 마지막 잎 새/오헨리

 

 

 

 

▶ 원의 둘레 넓이 구하기

class Circle : 
    pi = 3.141592 
    def __init__(self, radius) : 
        self.radius = radius
        self.area = 0
        self.circum = 0
        
    def getArea(self) :
        self.area = self.radius * self.radius * Circle.pi
        return self.area
    
    def getCircum(self) :
        self.circum = self.radius * 2 * Circle.pi
        return self.circum
    
    
cir1 = Circle(10) 
print("반지름 : %d" % cir1.radius)
print("넓이 : %.2f" % round(cir1.getArea(), 2))
print("둘레 : %.2f" % round(cir1.getCircum(), 2))
# 반지름 : 10
# 넓이 : 314.16
# 둘레 : 62.83

cir2 = Circle(5) 
print("반지름 : %d" % cir2.radius)
print("넓이 : %.2f" % round(cir2.getArea(), 2))
print("둘레 : %.2f" % round(cir2.getCircum(), 2))
# 반지름 : 5
# 넓이 : 78.54
# 둘레 : 31.42

 

 

 

▶ 삼각형의 넓이 구하기

class Triangle :
    def __init__(self, width, height) :
        self.width = width
        self.height = height
    def calculation(self) :
        return round((self.width * self.height ) / 2, 2)
    

t1 = Triangle(3, 4)
print(t1.calculation())
# 6.0

t2 = Triangle(10, 20)
print(t2.calculation())
# 100

 

 

 

 

 

▶ 점수와 평균 구하기

class SumAvg : 
    title = "--3과목 합계와 평균--"
    def __init__(self, name, kor, eng, math) :
        self.name = name
        self.kor = kor
        self.eng = eng
        self.math = math
    def getSum(self) : 
        return self.kor + self.eng + self.math
    def getAvg(self) : 
        return self.getSum() / 3

s1 = SumAvg("이순신", 78, 57, 100)
    
print(SumAvg.title)
print(f"name : {s1.name} \nkor : {s1.kor}\nmath : {s1.math}\neng : {s1.eng}\nSum : {round(s1.getSum(), 2)}\nAvg : {round(s1.getAvg(), 2)}")

# --3과목 합계와 평균--
# name : 이순신 
# kor : 78
# math : 100
# eng : 57
# Sum : 235
# Avg : 78.33

 

 

▶ 문장변환해서 출력하기

class EngSentence :
    def __init__(self, word) :
        self.word = word
    
    def reverse(self) :
        return self.word[::-1]
        
    def insertHypen(self):
        return self.word.replace(" ", "-")
    
    def get(self) :
        print("역순 : %s\n하이픈 삽입 : %s" % (self.reverse(), self.insertHypen()))
    
a = input("Enter the sentence : ")    
eng1 = EngSentence(a)
eng1.get()

# Enter the sentence : We are the champion!
# 역순 : !noipmahc eht era eW
# 하이픈 삽입 : We-are-the-champion!

 

 

 

 

 

 

*args 활용


class Calculator() :
        
    def some_numbers(self, *args) :
        self.li1 = args
    
    def total(self) :
        return sum(self.li1)
    
a = Calculator()
a.some_numbers(2, 4, 6)
print(a.total())
# 12

b = Calculator()
b.some_numbers(1, 2, 3, 4, 5)
print(b.total())
# 15

 

 

 

 

 

 

 

 

 

 

 

 

한번에 여러 클래스 선언


class Encore :
    def __init__(self, name, age) :
        self.name = name
        self.age = age
        
    def showMember(self) : 
        print("이름 : %s" % self.name)
        print("나이 : %d" % self.age)

mem1 = Encore("jung", 25)

list1 = [Encore("Karim", 55), Encore("Venzeam", 33)]

mem1.showMember()

for i in list1:
    i.showMember()
    
# 이름 : jung
# 나이 : 25
# 이름 : Karim
# 나이 : 55
# 이름 : Venzeam
# 나이 : 33

 

 

 

 

 

 

 

 

 

 

 

클래스의 상속


 

 

상속은 기존 클래스를 변경하지 않고 기능을 추가 하거나 기존 기능을 변경하려고 할 때 사용한다.

기존 클래스가 라이브러리 형태로 제공되거나 허용되지 않는 상황이라면 상속을 사용해야한다.

중복되는 코드를 줄일 수 있다는 장점이 있다.

 

 

 

▶ 기본 구조

class 클래스명(상속 할 클래스명) : 
	...

 

 

 

 

▶ 사칙연산을 상속한다.

class Operation :
    def __init__(self, a, b) : 
        self.a = a
        self.b = b
    
    def add(self) :
        return self.a + self.b
    def mul(self) :
        return self.a * self.b
    def sub(self) :
        return self.a - self.b
    def div(self) :
        return round(self.a / self.b, 2)
        
class Sample(Operation) :
    def squ(self) :
        return self.a ** self.b

a = Sample(5, 9)
print(a.add())
print(a.mul())
print(a.sub())
print(a.div())
print(a.squ())

# 14
# 45
# -4
# 0.56
# 1953125

 

 

 

 

 

 

 

 

 

 

 

메서드 오버라이딩


부모 클래스에 있는 메서드를 동일한 이름으로 다시 만들어 덮어쓰는것.

class Sample(Operation) : 
    
    def div(self) :
        if self.b == 0:
            return 0
        else : 
            return round(self.a / self.b, 2)
        
a = Sample(4, 0)
a.div()
# 0

 

 

 

 

 

 

 

 

super()


기존에 있었던 데이터를 이어서 작성할 경우 유용하게 쓰인다.

 

class Person :
    def __init__ (self, name, age) :
        self.age = age
        self.name = name
    def printInfo(self) :
        print(f"name : {self.name}\nage : {self.age}")
    
        
class Student(Person) :
    def __init__(self, name, age, school, major) :
        super().__init__(name, age)
        self.school = school
        self.major = major
    def printInfo(self) :
        super().printInfo()
        print(f"school : {s1.school}\nmajor : {s1.major}" )


s1 = Student("Jeni", 20, "Yale University", "CS")

s1.printInfo()

# name : Jeni
# age : 20
# school : Yale University
# major : CS

 

 

 

 

 

 

 

 

다중 상속


파이썬 자체에서 다중상속이 완벽하게 개선되고 있지 않고 있다.

참조를 해서 가져올 수 있지만 메소드 명이 같은 경우에는 정확하게 다 가져오지 못하는 문제가 있다.

class mClass1 : 
    def __init__(self) :
        print("mClass1")
class fClass2 : 
    def __init__(self) :
        print("mClass2")

class sunClass(mClass1, fClass2) :
    def __init__(self) :
        super().__init__()
        print("sunClass")
        
cl1 = sunClass()

# mClass1
# sunClass
class mClass : 
    def __init__(self) :
        print("mClass1")
    def getMother(self, mother) :
        self.mother = mother
        return self.mother
        
class fClass : 
    def __init__(self) :
        print("mClass2")
    def getFather(self, father) :
        self.father = father
        return self.father

class sunClass(mClass, fClass) :
    def __init__(self) :
        super().__init__()
        print("sunClass")
    def getSun(self, sun) :
        self.sun = sun
        return self.sun
        
cl1 = sunClass()
cl1.getMother("어머니")
cl1.getFather("아버지")
cl1.getSun("아들")

 

 

 

 

 

__str__


클래스내에서 선언하며 밖에서 str()로 클래스를 호출 할 때 __str__의 반환값을 반환한다.

class Student(Person) :
    def __init__(self, name, age, school, major) :
        super().__init__(name, age)
        self.school = school
        self.major = major

    def __str__(self) :
        return f"{self.name}은 {self.age}, {self.major}, {self.school}입니다."

str(Student("정상록", 25, "뉴욕주립대", "작곡"))
# '정상록은 25, 작곡, 뉴욕주립대입니다.'
반응형

'Python' 카테고리의 다른 글

[python] Package  (0) 2022.09.06
[python] 예외처리  (0) 2022.09.06
[python] CSV FILE  (0) 2022.09.01
[python] 파일 읽고 쓰기, 이름 바꾸기  (0) 2022.08.31
[python] for, if문 축약  (0) 2022.08.31