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 |