본문 바로가기
프로그래밍/python

python의 클래스 기본적인 사용 및 with구문

by 코딩은 잼있어 2020. 6. 22.
728x90

클래스 - class

  • 파이썬 클래스는 class 키워드를 사용하여 자신만의 데이터타입을 만들 수 있음
class Person:
    # 파이썬 클래스에서 __init__메서드나 생성자 역할을 수행 => 인스턴스가 만들어 질때 한번만 호출함
    def __init__(self, name):
        self.name = name
        print(self.name + ' is initialized')
    # 1번 메서드  
    def work(self, company):    # 클래스내에 메서드의 첫번째 인수를 self로 반드시 기술해야함
        print(self.name + 'is working in ' + company)
    # 2번 메서드
    def sleep(self):
        print(self.name + 'is sleeping')

# Person instance 2개 생성
obj = Person('Park')

# method들 
obj.work('ABCDEF')
obj.sleep()
# obj.name을 보면 알수 있듯이, 속성에 직접 접근함 => 파이썬에서는 기본적으로 모두 public
print('current person object is ', obj.name)

'''
Park is initialized
Parkis working in ABCDEF
Parkis sleeping
current person object is  Park
'''
  • class내에서 정의된 변수는 기본적으로 전역변수로 사용 및 classmethod의 기능
class Person:
    # class variable => 해당 클래스로 생성되는 모든 인스턴스가 공통으로 사용되는 변수
    count = 0
    def __init__(self, name):
        self.name = name
        Person.count +=1
        print(self.name + ' is initialized')
    def work(self, company):
        print(self.name + 'is working in ' + company)
    def sleep(self):
        print(self.name + 'is sleeping')

    @classmethod # =>classmethod으로 표시를 하면 객체 인스턴스를 의미하는 self 대신 cls라는 클래스를 의미하는 파라미터인수로 전달받음
    def getCount(cls):    # cls를 받아 class에서의 count값을 return 시킴
        return cls.count

obj1 = Person('Park')
obj2 = Person('Kim')

obj1.work('ABCDEF')
obj2.sleep()
# obj.name을 보면 알수 있듯이, 속성에 직접 접근함 => 파이썬에서는 기본적으로 모두 public
print('current person object is ', obj1.name,", ", obj2.name)

# count 를 출력하는 2가지 방법
print('Person count => ',Person.getCount())
print(Person.count)

'''
Park is initialized
Kim is initialized
Parkis working in ABCDEF
Kimis sleeping
current person object is  Park ,  Kim
Person count =>  2
2
'''

Private variable와 Private method

class PrivateMemberTest:
    def __init__(self, name1, name2):
        self.name1 = name1
        self.__name2 = name2    # private  member variable
        print('initialized with',name1, name2)

    def getNames(self):            
        self.__printNames()        # private 메서드여도 public인 getNames으로 호출하면 호출됨
        return self.name1, self.__name2

    def __printNames(self):        # private member method
        print(self.name1, self.__name2)

# 인스턴스 생성
obj = PrivateMemberTest('Park','Kim')
print(obj.name1)
print(obj.getNames())
# print(obj.__printNames()) # error, __printNames 메서드는 private으로 설정되어있어서 직접 접근할수 없다. 
# print(obj.__name2)        # error

클래스 내에 method나 variable이 private(__) 으로 설정되어있는 경우 직접접근을 할수 없다. 단, private이 안되있는 public 인스턴스(getNames)로 직접 접근이 아닌 간접 접근을통해 사용할수있다.

외부에서 가져온 함수이름과 클래스 메서드 이름이 같을경우

def print_name(name):
    print("[def] ", name)

class SameTest:
    def __init__(self):
        pass
    def print_name(self, name):
        print("[SameTest] ",name)
    def call_test(self):
        print_name('3번')
        self.print_name('4번')

obj = SameTest()
print_name('1번')
obj.print_name('2번')
obj.call_test()
'''
[def]  1번
[SameTest]  2번
[def]  3번
[SameTest]  4번
'''

외부 함수와 클래스메서드의 이름이 같은경우 => 그냥 사용할경우 함수가 출력함 반면에, self. or 인스턴스. 을 사용하면 클래스 메서드가 출력함

with 구문

  • 일반적으로 파일 또는 세션을 사용하는 순서는 다음과 같다

    open() => read() 또는 write() => close()

  • 그러나 python에선 with 구문을 사용하면 명시적으로 리소스 close()를 해주지 않아도 자동으로 close 해주는 기능이 있음. with 블록을 벗어나는 순간 파일이나 세션등의 리소스를 자동으로 close 시킴

=> 딥러닝 프레임워크인 TensorFlow의 session 사용시 자주 사용됨

# 일반적인 방법
f = open("./file_test", 'w')
f.write("Hello, Python !!!")
f.close

# with 구문을 사용한 방법
with open("./file_test", 'w') as f:
    f.write("Hello, Python !!!")
728x90

'프로그래밍 > python' 카테고리의 다른 글

[python] Generator 나만의 정리  (0) 2020.12.12
python을 활용한 웹 크롤링  (0) 2020.08.23