본문 바로가기
개발일지/Python

2022.02.10 15.2강 여러가지 메서드 (나중에 중요 array)

by 개발에정착하고싶다 2022. 2. 10.
320x100
# 15.2 여러가지 메서드

'''
# 클래스 메서드

class Car:
    count = 0
    def __init__(self,name):
        self.name = name
        Car.count += 1 # 굳이 Car.로 시작을 해야지 이용이 가능한건가; Car안에 있다고 쓰인다고
                        # 하기엔 너무 단순한생각이고 결과는 복잡해진다.
        @classmethod # 도대체 @이렇게 표현하는게 무슨 의미일까
        def outcount(cls):
            print(cls.count)

pride= Car("프라이드")
korando=Car("코란도")
Car.outcount() # AttributeError: type object 'Car' has no attribute 'outcount'가 나온다.
# 당췌 뭐가 잘못된건지 모르겠다. 코드는 똑같이 따라썼는데
# 그냥 버릴래

'''

'''
# 정적 메서드
# 특정 객체에 소속되지 않고 클래스와 관련된 동작을 하는 것도 아니여서 self나 cls를 인수로 받지 않는다.
# 정의할때 @staticmethod 데커레이터를 붙인다.

class Car:
    @staticmethod
    def hello():
        print("오늘도 안전 운행 합니다.")
    # 사실상 여기부터
    # count =0
    # def __init__(self,name):
    #     self.name = name
    #     Car.count +=1
    # @classmethod
    # def outcount(cls):
    #     print(cls.count)
    # 여기는 무슨 의미로 쓰였는지 노이해다; 제발 적합한 이해가 될 수 있는 짜임새 예제를 생각하고 작성했음 한다.

Car.hello()

# 그러나 # 정의할때 @staticmethod 데커레이터를 붙인다. 이건 중요하다고 본다.
# 이번 챕터부터 다시금 설명 부재+무의미한 예제가 시작됨을 스멀스멀 느낀다 .. 지친다.
'''

'''
# 연산자 메서드

class Human:
    def __init__(self,age,name):
        self.age = age
        self.name = name

#    def __eq__(self, other):
#        return self.age == other.age and self.name == other.name

kim = Human(29,"김상형")
sang = Human(29,"김상중")
moon= Human(44,"문종민")
print(kim==sang)
print(kim==moon)


# 클래스에 들어가는 모든 정의함수는 해당 클래스로 인해서 한번에 사용할 수 있는건가? 다시금 생각해보게 된다.
# 두번째 정의함수인 __eq__가 동일한 값을 뽑아내는 역할을 하는건 알았다. 근데 굳이 필요했는가?
# 아이 싀벌 진짜 또시작이네 예제를 왜자꾸 뭔가 아다리가 맞아 떨어지지도 않게 해놓냐
# 주석처리해도 졸라 무의미한 예제만 잔뜩 점철되서 진짜 졸라쓸모없네 이해에 연계성이 있어야지 하..
'''

'''
# 특수 메서드

class Human:
    def __init__(self,age,name):
        self.age = age
        self.name =name
    def __str__ (self):
        return "이름 %s, 나이 %d" % (self.name,self.age)

# kim = Human(29,"김상형")
#print(kim)
print(Human(29,"김상혁"))

# 음..... 여기 클래스에도 분명 2개의 정의함수가 들어있다. 첫번째 정의함수는 ()안에 들어갈 기능을 정리해준 느낌이고
# 두번째 정의함수는 그 정의된 첫번째 함수로 어떻게 사용할 것인지에 대해서 다뤄보는 것같았고
# 실제로 개 쉽게 그냥 간단하게 클래스(값,값) 해주니깐 안에 정의함수처럼 나왔다.
# 바로 이 전 예제는 정의함수를 했음에도 왜 굳이 == 라는 식으로 또 표현을 했는가? 만약 쓸 필요가 없다면 왜 굳이 써서 사람 헷갈리게 하는건가
# 만약 쓸필요가 있다면 왜 굳이 정의함수를 클래스 안에 넣었는가 저자의 생각이 졸라게 궁금해진다
# 그냥 이래도 욕먹을만하고 저래도 욕먹을만하다라... 어이가 없다 이쯤되니
'''

'''
# 위의 생각에 대해서 테스트 용 코드
class a:
    def __init__(self,age,name):
        self.age =age
        self.name =name

    def __eq__(self, other):
        return "이름은 %s이고, 나이는 %입니다."%(self.name,self.age)


print(a(29,"김상혁")) # 독특하다. 뭔가 나중에 어떻게 쓰일진 모르겠으나
# 이렇게 써도 메모릭값만 나오니 내 기준에선 클래스 내부의 __eq__함수가 필요없던 것이라고 판단된다.
'''



# 15.3 유틸리티 클래스
'''
# Decimal

f = 0.1
sum = 0
for i in range(100):
    sum +=f
print(sum)
# 이번 챕터부터는 또다시 설명을 잘해준다
# 내가 봤을때 이 저자는 뭔가 배경지식이 자기 기준으로 3이하 필요하다고 생각하는 부분은 설명 자세히 해주고 
# 4부터 6은 간략 설명, 7부턴 설명을 생략하는 식으로 하는게 분명하다 싀벌
# 책값이 22,000원인데 인세가 보통 10~20%니깐 약하게 잡아서 10%라고 했을때 2,200원이다.
# 저자가 권당 1,100원 가져가면 딱 적합할것같다. 나머지 돈은 사회에 기부하고, 출판사가 먹는게 아니고 
# 뭐 그래도 이건 흥미가 있다.
# 0.1을 100번 더하면 결과값이 10이 되어야 할테지만 실제 연산은 9.99999999999998가 나온다.
# 너무 당황스러운 값이지만 아무튼 2진실수로써 딱 떨어지진 않는다고 한다.
'''

'''
# 위와같은 현상이 있고 소수점들을 더해봐야 정확한 값이 안나오기 때문에
# 우리가 통상 아는 소수점의 정확한 값을 구하기 위해서
# Decimal함수를 쓴다고 한다.
from decimal import Decimal # 아니 왜자꾸 이지랄하는건데 진짜
                            # 라고 생각해서 앞의 from을 지우고 시도해봤더니 작동이 안되더라.
                            # 이거는 기능적 이유가 있는 임포트 인것같다.

f = Decimal("0.1")
sum = 0
# for i in range(99): # 9.9
for i in range(100): #10
    sum +=f
print(sum)

# 엥? 근데 Decimal 객체는 f+3은 가능하지만 f+ 0.1은 불가능하다고 한다.
# 음... 흥미롭군..
'''

'''
from decimal import *

a = Decimal ("11111111")
b = Decimal("11111111")

setcontext(BasicContext)
# BasicContext = 유효 자리 수 9, ROUND_HALF_UP 반올림
c = a*b
print(c) #1.23456788E+14

setcontext(DefaultContext)
# DefaultContext = 유효 자리 수 28, ROUND_HALF_EVEN 반올림
c = a*b
print(c) # 123456787654321

setcontext(ExtendedContext)
# ExtendedContext = 유효 자리 수 9, ROUND_HALF_EVEN 반올림
c = a*b
print(c) # 1.23456788E+14
'''

# Fraction

'''
# Fraction([부호] 문자, 분모)

from fractions import *

a = Fraction(1,3)
print(a)
b = Fraction(8,14)
print(b)

#오.... 분수형태로 최대의 약분이 되어있는 상태로 출력이 되는게
# 이 Fraction 함수 같다.
# 물론 Fraction 함수를 써주기 위해서는 위에처럼 fractions를 임포트 해줘야한다.
'''

'''
from fractions import *

a = Fraction(2,3)
b =Fraction(3,5)
c = a+b
print(c)

d = c+0.1 # 이처럼 실수가 섞이게 되면 float형태로 변화하게 된다.
print(d)
'''

# array

'''
array (타입코드, [초기값])

import array

ar = array.array("i",[33,44,67,89,56])
for a in ar:
    print(a,end=",")
ar.append(100)
del ar[0]
print("\nar[1] = ",ar[1])
print(ar[2:4])

# 이것역시 설명은 되었으나, 글쎄... 이건 설명이 문제가 아닌것같다.
# 내 경험이 문제인것같다.
# 아무튼 이건 속도를 매우 업해줄 수 있는 기능이라고 한다.
# 메모리 낭비가 없다나 뭐라나.
# 아무튼 지금은 와닿질 않지만 언젠간 반드시 유용하게 써야할 함수라고 본다.
'''

300x250