Language/Python

231123 Python_class, 인스턴스화, 인스턴스 변수, method

잇꼬 2023. 11. 23. 17:28
728x90
반응형
SMALL
from pandas import Series, DataFrame
import pandas as pd


# class 생성

class Person:
    info = '' # instance 변수로 하는게 더 깔끔할 듯!
    def showinfo(self, name, age): # 형식매개변수
        self.info += '이름 : {}, 나이 : {} \n'.format(name, age) # \n(엔터키) 은 print를 사용해야 효과


# man 인스턴스화

man = Person() #인스턴스화
man.info
man.showinfo('홍길동', 30)
man.info
man.showinfo('박찬호', 20) # 추가 정보(누적)
print(man.info)


# woman 인스턴스화

woman = Person() #인스턴스화
woman.info
woman.showinfo('고애신', 21)
woman.info
woman.showinfo('이양화', 22)
print(woman.info)


# global 변수, 공유 가능성

class Person:
    hobbys = [] # global variable, 공유가 됨, self.hobbys 로 하여도 글로벌변수로 사용
    def add_hobbys(self, arg):
        self.hobbys.append(arg)


# p1 인스턴스화

p1 = Person()
p1.hobbys
p1.add_hobbys('야구보기')
p1.hobbys
p1.add_hobbys('만화책보기') # 정보 추가(누적)
p1.hobbys

 

# p2 인스턴스화

p2 = Person()
p2.add_hobbys('런닝') # p1의 누적 정보도 같이 보임, 주의해야 할 지점!
p2.hobbys

★ (주의) 리스트 변수가 global variable 가 된다!

# 해결방안) 리스트 변수를 instance variable 로 생성해야 한다면

class Person:
    def __init__ (self): # 인스턴스 메소드
        self.hobbys = [] # instance variable
    def add_hobbys(self, arg):
        self.hobbys.append(arg)


# p1 인스턴스화

p1 = Person() # __init__ (self) 에만 허용. 
p1.hobbys
p1.add_hobbys('야구보기')
p1.hobbys
p1.add_hobbys('만화책보기') # 정보 추가(누적)
p1.hobbys


# p2 인스턴스화

p2 = Person()
p2.add_hobbys('런닝')
p2.hobbys


__init__ (self) : 형식매개변수를 적용했을 경우

class showinfo:
    def __init__ (self, arg1, arg2): # 형식매개변수 선언 -> 인스턴스화 했을 경우, 값을 지정해줘야 한다
        self.name = arg1 # self.arg1 = arg1 도 가능
        self.age = arg2
    def printinfo(self): 
        print('이름 : {}, 나이 : {}'.format(self.name, self.age))


    
__init__ 메소드에 형식매개변수가 구성되어 있으면 클래스를 인스턴스화 할때 꼭 실제값을 입력해야 한다

s = showinfo('홍길동', 20)
s.printinfo()

s1 = showinfo('제임스', 30)
s1.printinfo()

s2 = showinfo() # 실제값을 지정해주지 않아 오류발생


# 인스턴스화된 변수명.__dict__ : 네임스페이스 확인

s.__dict__ # 입력값 확인
s1.__dict__


__str__ : return 값 출력, 인스턴스를 print() 또는 str() 하면 수행되는 메소드 이다.

class showinfo:
    def __init__ (self, arg1, arg2): # 형식매개변수 선언 -> 인스턴스화 했을 경우, 값을 지정해줘야 한다
        self.name = arg1 # self.arg1 = arg1 도 가능
        self.age = arg2
    def __str__(self): # print 메소드
        return '이름 : {}, 나이 : {}'.format(self.name, self.age)


# s1 인스턴스화, 호출

s1 = showinfo('홍길동', 20)
s1.name
s1.age
print(s1)
str(s1)


__repr__ : 인스턴스를 print() 또는 str() 하면 수행되는 메소드 이다.

class showinfo:
    def __init__ (self, arg1, arg2): # 형식매개변수 선언 -> 인스턴스화 했을 경우, 값을 지정해줘야 한다
        self.name = arg1 # self.arg1 = arg1 도 가능
        self.age = arg2
    def __repr__(self): # print 메소드
        return '이름 : {}, 나이 : {}'.format(self.name, self.age)



s1 = showinfo('홍길동', 20)
s1.name
s1.age
print(s1)
str(s1)


# 클래스 안에 __repr__, __str__ 같이 있을 경우에 __str__ 수행 된다.

class showinfo:
    def __init__ (self, arg1, arg2): # 형식매개변수 선언 -> 인스턴스화 했을 경우, 값을 지정해줘야 한다
        self.name = arg1 # self.arg1 = arg1 도 가능
        self.age = arg2
    def __repr__(self): # print 메소드
        return '2. 이름 : {}, 나이 : {}'.format(self.name, self.age)
    def __str__(self): # print 메소드
        return '1. 이름 : {}, 나이 : {}'.format(self.name, self.age)

 

s1 = showinfo('홍길동', 20)
s1.name
s1.age
print(s1)
str(s1)


# self 지시어 유무

class Test:
    def test_1(): # 클래스 메소드
        print('클래스 함수')
    def test_2(self): # 인스턴스 메소트
        print('인스턴스 함수')


# class method, instance method

t1 = Test() # 인스턴스화
t1.test_2()
t1.test_1() # 클래스 함수이기 때문에 인스턴스를 통해서 수행하면 오류발생

Test.test_1() # 클래스 함수이기 때문에 클래스를 통해서 수행해야 한다.
Test.test_2() # 인스턴스 함수이기 때문에 인스턴스를 통해서 수행해야 한다. 오류발생


# datetime 확인

import datetime
datetime.datetime.now() # 클래스 메소드(함수), 글로벌


# 문제: cnt(인스턴스 변수) 값이 초기화가 되고 있다. 인스턴스화 될때 카운팅은 초기화가 된다

class Employee:
    cnt = 0 # 글로벌 변수
    def __init__(self, arg1, arg2):
        self.name = arg1
        self.age = arg2
        self.cnt += 1 # 인스턴스 변수
    def show(self):
        print('이름 : {}, 나이: {}'.format(self.name, self.age))
    def showcnt(self):
        print('전체 접속한 인원은 {}명 입니다'.format(self.cnt))


# 문제확인

e1 = Employee('홍길동', 20)
e1.show()
e1.showcnt()

e2 = Employee('손흥민', 25)
e2.show()
e2.showcnt() # 문제) 카운팅 초기화


# 해결: cnt를 글로벌 변수로 변환 -> 클래스명.변수명 ex) 유튜브 라이브방송 카운트 추가

class Employee:
    cnt = 0 # 맨 처음 인스턴스화 되었을 때만 적용
    def __init__(self, arg1, arg2):
        self.name = arg1
        self.age = arg2
        Employee.cnt += 1 # global, class 변수로 변환
    def show(self):
        print('이름 : {}, 나이: {}'.format(self.name, self.age))
    def showcnt(self):
        print('전체 접속한 인원은 {}명 입니다'.format(Employee.cnt))


# 인스턴스화 및 문제해결

e1 = Employee('홍길동', 20)
e1.show()
e1.showcnt()

e2 = Employee('손흥민', 25)
e2.show()
e2.showcnt() 

e1.showcnt()

e3 = Employee('나얼', 25)
e3.show()
e3.showcnt()


# 인스턴스 종료. ex) 유튜브 라이브방송 카운트 차감

class Employee:
    cnt = 0 # 맨 처음 인스턴스화 되었을 때만 적용
    def __init__(self, arg1, arg2):
        self.name = arg1
        self.age = arg2
        Employee.cnt += 1 # global, class 변수로 변환
    def show(self):
        print('이름 : {}, 나이: {}'.format(self.name, self.age))
    def showcnt(self):
        print('전체 접속한 인원은 {}명 입니다'.format(Employee.cnt))
    def __del__(self): # 인스턴스 해지할 때, 메모리 삭제
        print('{} 접속해지 했습니다.'.format(self.name))
        Employee.cnt -= 1


# del 인스턴스 

e1 = Employee('홍길동', 20)
e1.show()
e1.showcnt()

e2 = Employee('손흥민', 25)
e2.show()
e2.showcnt() 

e1.showcnt()

e3 = Employee('나얼', 25)
e3.show()
e3.showcnt() 

del e3 # 인스턴스 해지, 종료
e1.showcnt()
e2.showcnt()

del e2 # 인스턴스 해지, 종료
e1.showcnt()



# 모듈화

if __name__ == '__main__':
    lst1 = [1,2,3,4,5,4,2,1]
    lst2 = [4,5,6,8,7,4,9]
    s = Set()
    print('union', s.union(lst1, lst2))
    print(s.union_all(lst1, lst2))
    print(s.intersect(lst1, lst2))
    print(s.minus1(lst1, lst2))
    print(s.minus2(lst1, lst2))

 

# 파일명이 모듈명

import sys
sys.path

sys.path.append('C:\\mypython')
sys.path

 

new = set.Set()
print(new.union(lst1, lst2))
print(new.union_all(lst1, lst2))
print(new.intersect(lst1, lst2))
print(new.minus1(lst1, lst2))
print(new.minus2(lst1, lst2))



728x90
반응형
LIST