반응형

변수 < 함수< 클래스 < 파일(모듈) < 패키지

함수 부터를 모듈 프로그래밍 이라고 합니다.

 

 

**클래스

1.용어

1) class: 동일한 목적을 달성하기 위해 모인 변수와 함수의 집합

사용자 정의 자료형 : 사용자가 만드는 자료형

 

 

2)object:프로그래밍에서 사용되는 모든 것

 

3) class object: 클래스와 동일한 의미

 

4) instance : class를 기반으로 만들어진 객체

 

2. 파이썬에서 클래스 정의

class 클래스이름:

           코드 작성

 

3.method작성

=>method: class 안에 만들어진 함수

1)member method: 만들기는 클래스에 만들지만 실제 사용은 instance가 하는 메소드

=>.python에서느느 member method를 만들 때 매개변수가 반드시 1개 이상 있어야 합니다.

이 매개변수느느 instance자신의 참조가 대입됩니다.

이름은 관습적으로 self라고 합니다.

도움말을 확인할 때 첫번쨰 매개변수로 self가 있으면 이 메소드는 member method입니다.

 

instance가 반드시 있어야 합니다.

 

def 메소드이름(self [, 다른 매개변수르 선언]):

           메소드 수행 내용

 

2)member method호출

자신의 클래스 내부에서 호출 : self.메소드이름(매개변수) ->self에는 아무것도 대입하지 않습니다.

self에는 대입하면 안된다.

 

클래스 외부에서 호출 - 바운드 호출: 인스턴스이름.메소드이름(매개변수) ->self에는 아무것도 대입하지 않음

 

클래스 외부에서 호출 - 인바운드 호출: 클래스이름.메소드이름(인스턴스,매개변수) ->selfinstance를 대입해야 합니다.

 

 

3)클래스의 인스턴스

생성자(매개변수)

 

class Student:

    #member 메소드

    def func(self):

        print("member method")

 

obj = Student()

obj.func() #인스턴스가 호출 -권장

Student.func(obj)#클래스가 메소드를 호출

 

4.속성(field, attribute..)

=>객체 안에 데이터를 저장할 수 있는 변수

=>클래스 안에서 메소드 외부에 변수가 선언되면 클래스가 사용할 수 있고 인스턴스는 읽을 수만 있습니다.

인스턴스가 메소드 외부에 선언된 변수를 수정하게 되면 인스턴스 안에 변수를 만들어서 저장을 합니다.

 

=>메소드 안에서 만들어진 변수느 메소드 안에서만 사용이 가능한 지역변수가 됩니다.

=>메소드 안에서 변수를 만들 때 self.변수명을 사용하면 인스턴스가 별도로 소유하는 인스턴스 변수가 됩니다.

=>파이썬의 인스턴스는 속성을 추가 할 수 이있습니다.

인스턴스이름.속성명 = 데이터

이 속성이 존재하면 수정이고 없으면 추가해서 대입합니다.

class Student:

    #이 변수는 클래스와 인스턴스 모두 접근 가능하지만

    #인스턴스는 수정 못함

    schoolName ='중앙'

 

#메소드 바깥에 있는 변수는 클래스와 인스턴스 모두 호출 가능

print(Student.schoolName)

obj = Student()

print(obj.schoolName)

 

 

#클래스가 수정

Student.schoolName ='메가스터디'

print("수정한 후 출력")

print(Student.schoolName)

print(obj.schoolName)

 

 

obj.schoolName ='서울대학교'

print("인스턴스로 수정 한 후  출력")

print(Student.schoolName)

print(obj.schoolName)

그래서 클래스 만들 때 조심해야 한다 . 바깥에서 변수 만드는 경우는

 

class Student:

    #이 변수는 클래스와 인스턴스 모두 접근 가능하지만

    #인스턴스는 수정 못함

    schoolName ='중앙'

 

    def method(self):

        self.num =1 #인스턴스가 사용할 수 있는 변수 생성

        age = 20 #메소드 안에서만 사용할 수 있는 변수 생성

 

#메소드 바깥에 있는 변수는 클래스와 인스턴스 모두 호출 가능

print(Student.schoolName)

obj = Student()

print(obj.schoolName)

 

 

#클래스가 수정

Student.schoolName ='메가스터디'

print("수정한 후 출력")

print(Student.schoolName)

print(obj.schoolName)

 

 

obj.schoolName ='서울대학교'

print("인스턴스로 수정 한 후  출력")

print(Student.schoolName)

print(obj.schoolName)

 

 

#파이썬은 클래스에 없는 속성을 인스턴스에 추가 가능

obj.name = 'Park'

print(obj.name)#없는 이름 쓰면 계속 추가된다.

 

#method에서 self.num age를 생성

obj.method()

print(obj.num)# 인스턴스 변수가 호출 가능

print(obj.age)#age 는 지역변수라서 인스턴스가 호출 불가능

 

5. 특수 속성

=>파이썬이 용도를 정의해놓은 속성

=> __로 시작하고 __로 끝남

대표적인 속성이 __doc__ 로 함수에서 이 속성에 문자열을 대입하면 help로 확인이 가능합니다.

 

6.constructor(생성자)

=>__init__라는 이름으로 생성자를 만듭니다.

=>첫번째 매개변수는 self이고 이후에 매개변수 추가가 가능

만들지 않아도  self만 가진 생성자가 클래스에 자동으로 추가됩니다.

__init__(self)는 존재합니다.

 

=>새로 생성자를 추가하면 기본적으로 제공되는 생성자는 소멸됩니다.

=>생성자를 만드는 이유는 다른 메소드를 호출하지 않고 인스턴스 속성을 초기화하기 위해서 입니다.

=>생성자를 호출하는 방법은 클래스이름(메개변수) 형태로 하고 호출하면 메모리 할당을 한 후 그 메모리에 대한 참조를 리턴합니다.

 

여기서 name이 만들어진다.

 

class Student:

    #생성자 -매개변수 없이 호출하면  name =None매개변수를 대입하면 그값이 name에 대입

    def __init__(self,name =None):

        self.name = name

   

    def getName(self):

        return self.name

 

    def setName(self,name):

        self.name = name

 

obj = Student()

#setName을 호출하면 self.name이 만들어지기 때문에 문제가 안됨

obj.setName('park')

print(obj.getName())

 

obj1 = Student()

print(obj1.getName())#생성자가 없으면 setName을 호출하지 않았기 때문에 name이 없음

 

 

obj2= Student('Steve')

print(obj2.getName())

 

7. __del__

=>인스턴스가 파괴될 때 호출되는 메소드

=>self이외의 매개변수는 가질 수 없음

=>파이썬의 메모리 관리는 Reference count(참조 횟수 ) 방식

=>참조 횟수가 0이 되면 파괴됩니다.

=>인스턴스가 변수에 대입되면 참조 횟수는 1증가

def(변수명)을 호추하거나 None을 대입하면 참조 횟수가 1 감소

=>참조 횟수를 확인하고자 하는 경우는 sys모듈의 getrecount라는 함수에 인스턴스를 대입하면 됩니다.

import sys

class Temp:

    #소멸자

    def __del__(self):

        print('인스턴스가 파괴됩니다.')

 

#생성자를 호출해서 인스턴스를 생성 한 후 t에 대입 - 참조 횟수 1

t = Temp()

#인스턴스를 다른 곳에 대입하면 참조횟수가 1 증가 합니다.

k = t

 

print(sys.getrefcount(k))

 

#변수에 None을 대입 - 참조 횟수가 1줄어듬

t = None

 

del(k) #변수를 삭제합니다. - 참조 횟수가 1 줄어듬

#데이터 횟수가 맞아야 한다.

 

 

 

 

8. 정적 메소드 :클래스가 호출하는 메소드

1)static메소드

메소드 위에 @staticmethod라고 기재하고 매개변수를 만들 때 self를 만들지 않습니다.

self가 없어집니다.

 

2)class메소드

메소드 위에 @classmethod라고 기재하고 첫번째 매개변수는 클래스 자신이 대입된느 cls를 추가

cls->자기 클래스

 

9. __slots__ 속성

=> 이 속성에 list로 문자열을 대입하면 문자열에 해당하는 속성만 사용 가능

class DTO:

    def __init__(self, num = 0, name=None):

        self.num = num

        self.name = name

    #name num이외의 속성은 만들 수 없도록 제한하기

    __slots__ = ['name','num']

 

dto = DTO(1,'park')

dto.tel ='01037900199'

 

 

10.property

=>객체 지향 프로그래밍에서는 인스턴스가 변수를 직접 사용하는 것을 권장하지 않습니다.

gettersetter를 이용해서 접근하는 것을 권장

=>파이썬에서는 인스턴스 변수를 만들 때 __를 앞에 붙이면 인스턴스가 변수에 접근을 못합니다.

=>property(fget=None,fset = None, fdel =None, doc=None)함수를 이용해서 gettersetter메소드를 지정할 수 있습니다.

변수를 사용하는 것처럼 사용하지만 실제로는 property에 설정된 메소드를 호출합니다.

class DTO:

    def __init__(self,name = None):

        #private처럼 클래스 외부에서는 __name에 접근할 수 없습니다.

        self.__name = name

 

    def getName(self):

        print('getter')

        return self.__name

    def setName(self,name):

        print('setter')

        self.__name = name

    #.name을 호출하면 getName이 호출되고 .name= 값 을 호출하면 setName이 호출

    name = property(fget=getName, fset=setName)

 

dto = DTO('park')

#print(dto.__name)

dto.name = 'kkk'

print(dto.name)

 

 

11.연산자 오버로딩

=>연산자의 기능을 변경하는 것

=>__add__(self,other)이 메소드를 만들면 이 클래스의 인스턴스들은 +연산을 할 수 있음

그 이외에도 sub(-), mul(*)을 재정의 하면 다른 연산자도 사용 가능

=>dir(인스턴스나 클래스)로 사용할 수 있는 메소드를 확인해서 어떤 연산이 가능한지 확인을 할 필요가 있습니다.

 

li1 = [100,300]

#print(dir(li1))

 

li2 = [30,70]

print(li1+li2) #__add__가 있어서 더하기 가능

print(li1 > li2) #__gt__가 있어서 > 가능

 

#날짜는 - 가 있고 +는 없다.

#__str__ =>tostring하고 같은 기능이다.

 

 

 

12.상속

class 클래스이름(클래스 이름 나열):

=>파이썬은 다중 상속이 되서 여러 개의 클래스로 부터 상속 가능

다중 상속은 별로 안좋다.이름이 동일하면 오류 난다.

하지만 파이썬은 여러 클래스에 동일한 이름의 속성이나 메소드가 있으면 앞에 작성한 클래스의 것을 상속받습니다.

 

**파이썬과 R의 차이

R:분석만 가능 - 최근에는 프로그램을 만드는 것도 가능하지만 불편합니다.

python : 범용 프로그램잉 언어 - 분석을 쉽게 할 수 있는 라이브러리가 제공 분석도 가능

 

단순하게 분석을 해서 보기만 할 거라면 R이 좋지만 결과물을 생성할려고 하면 python이 우세합니다.

 

r은 가공을 잘 못하는데 파이썬은 가공을 잘 한다.그러면 클래스의 객체지향 문법을 알아야 한다.

 

 

 

반응형

'Study > Python' 카테고리의 다른 글

Python-14  (0) 2020.11.03
python-12  (0) 2020.10.26
python-11  (0) 2020.10.26
python-10  (0) 2020.10.26
Python-9  (0) 2020.09.12

+ Recent posts