알쏭달쏭 공부한거 쓰기

7/6 수업 내용 본문

파이썬 -23여름학기(ㄱㅎㅈ)

7/6 수업 내용

elec_cy 2023. 7. 6. 15:26

#객체 프로 그래밍

 

https://colab.research.google.com/drive/1NrGiqH2bslaVbRPzDg-hohmWBQuf83L9#scrollTo=gfyr4peyS4il

 

Day_09.ipynb

Colaboratory notebook

colab.research.google.com

7_6.py
0.01MB
test7.py
0.00MB
test7.pdf
0.30MB

 

 

 

객체>class 클래스명:(보통 대문자)

#속성

def__init__() #이런 __있는 함수 speacial 매소드 보통 직접 부르기 보다는 자동으로 불러진다.

    self. 속성이름  #인스턴스 변수

#동작:메소드(동일한 함수인데 클래스 안에 쓰일때 매소드라고 불림)

def 함수명 (self, 매개변수)

    내용

 

#강아지 프로그래밍하기

 

1.속성은 private 하게 내부에서는 접근 가능, 외부에서는 접근 하지 못하게 만들어야한다.

밖에서 바꿀수 없게 

외부에서 속성이 궁금할때. getter()

외부에서 바꿀수 있는 속성에 대해서 바꿀때 . setter()

 

2.스페셜 메소드

__str__()는 print(객체명)하면 자동으로 불린다.

print(객체명) ==print(__str__)

 

3.연산자와 스페셜 메소드

>>>3+4

7

사실 (3).__add__(4) #정수는 ()해야함

에서 특수 메소드 ___add__ 를 호출한 것이다.

강아지 두 개를 더해달라 강아지와 강아지의 +연산을 지원하지 않는다. +를 할 수 있으려면 

add라는 speacial 메소드가 정의 되야함

 

그럼 정의해보다

강아지 두개를 더해달라는 것은 두 강아지의 나이의 합이라고 하자#말이 안되지만 그냥 설명하기 위해서

 

lt=less than

le=less equal

 

lt-gt

le-ge

둘이 쌍이므로 둘중에 하나만 정의 하면 나머지는 알아서 된다.

eq-!eq

 

+>== 이거 세개 구현하는 거 시험에 냈다고함

1. private하지 않을 경우

{'width':100,'height':200}

100

2.private한 경우 속성 앞에_있느냐 없느냐 차이

{'_Test__width':100,'_Test__height':200}

100

class Test:

    def __init__(self,a):

        self.__a=a

 

t=Test(3)

print(t.__dict__)

print(t.__a)

print(t._Test_a)

._a> _1개는 안되지만 파이썬에서 막지 않음

.__a>_2개는 파이썬에서 막음>파이썬에서 __a>_Test__a로 바꿔버린다.

 

강의 자료에 없음

 

 

대화형모드에서

print(d1)은 제대로 나오는데 

d1이라고 치면 제대로 나오지 않는데 

이거랑 리스트 부르면 안에  나오는 거랑 비슷함

이때 d1만 치고 제대로 나오게 하고 싶으면 

def __repr__(self):

    return f'{d1} '

 


실습
 

1. 아래 코드의 오류를 수정하시오

(1)
```
class MyClass:
  def __init__(self):
    self.radius = 10
```
'''
radius는 인스턴스 변수>_이나__ 붙여주자
'''

(2)
```
class MyClass:
  def __init__(self, r):
    self.__radius = r
  def get_radius(self):
  	return self.__radius

a = MyClass(10)
print(a.__radius)
print(a.get_radius())
```
'''
get으로 속성에 직접 접근하지 않은 것은 좋지만 구현이 안되어 있다.>완료
'''

파이썬은 얕은 복사 지원

대입만하면 주소를 넣음

org=list(range(1,11))

cpy=org

cpy.reverse()#원본 바꿈 #[10,..,1]

org=[10,...,1]

둘이 동일한 객체에 대해 같은 주소를 가지고 있는데 그 객체를 reverse해서 원본도 바뀌어보림

 

깊은 복사

import copy

cpy=copy.deepcopy(org)

cpy.reverse()

cpy=[10,....,1]

org=[1,...,10]

 

아니면 직접 작성

cpy=[]

for x in org:

    cpy.append(x)

이렇게 생성된 리스트는 org와 cpy와 다른 리스트이다.

 

is는 같은 주소(id)에 대해 물어봄. 같은 객체인가?

==는 내용상 같은 지를 물어보는 것이다.

 

ex) class person:

속성 :이름, 나이

 

is 동일인물?>20세 홍길동(A)  is  20세 홍길동 (B)>False

== 이름, 나이 20세 홍길동(A) == 20세 홍길동 (B)> True

 

 

mutable 객체(리스트)에서 is 비동일 ==

리스트에서는 같은 내용의 리스트라도 변경이 가능한 객체라도 따로 따로 만들 수 밖에 없다

 

immutable 객체(상수-튜플, 문자열,정수,실수,부울)에서 is 동일 ==

문자열 같은 경우에는 내용 변경이 불가능함으로 다른 주소를 줄 필요가 없어서 동일한 객체의 주소를 받음

아까 정수랑 리스트 원본 변경시 카피본 변경여부에대해 설명할 수 있을 듯