-11일차- Everything in Python is Object
23년 이전 글/모두의연구소 아이펠

-11일차- Everything in Python is Object

코드와 결과물은 깃허브에 있습니다

 

GitHub - dlfrnaos19/FundamentalOfMachineLearning: Machine Learning study notes

Machine Learning study notes. Contribute to dlfrnaos19/FundamentalOfMachineLearning development by creating an account on GitHub.

github.com

 

파이썬 문서에서 강조하고 한번 더 강조하는 문구가 있다

This is so important that I'm going to repeat it in case you missed it the first few times: everything in Python is an object. Strings are objects. Lists are objects. Functions are objects. Even modules are objects.

 

2.4. Everything Is an Object

In case you missed it, I just said that Python functions have attributes, and that those attributes are available at runtime. 2.4.1. The Import Search Path Before you go any further, I want to briefly mention the library search path. Python looks in sever

linux.die.net

 

이러한 파이썬을 100% 활용하기 위해서는 객체에 대한 이해도가 높을 수록 유리하다

id 함수

사람이 주민번호를 가지고 있듯이 객체 고유의 번호를 확인할 수 있다

 

얕은 복사와 깊은 복사

초보가 보기에는 쌩뚱맞은 경우

list1에 값을 추가했지만 list2에도 값이 생긴 것을 볼 수 있다

이에 대한 이해가 없이 본다면 파이썬 언어가 이상하다고 생각할지도 모른다

 

얕은 복사와 깊은 복사에 대한 간단 정의

 

copy — Shallow and deep copy operations — Python 3.10.1 documentation

copy — Shallow and deep copy operations Source code: Lib/copy.py Assignment statements in Python do not copy objects, they create bindings between a target and an object. For collections that are mutable or contain mutable items, a copy is sometimes need

docs.python.org

보통의 사람이 생각하는 복사는 깊은 복사에 해당할 듯 하다

 

프로그래밍 방법론

 

클래스 객체와 호출 할때마다 달라지는 객체의 차이

 

클래스와 함수의 작명 규칙

클래스 : 카멜 케이스, 명사위주로 ex) Camel Case

함수 : 스네이크 케이스, 동사위주로 ex) snake_case

 

PEP 8 -- Style Guide for Python Code

The official home of the Python Programming Language

www.python.org

 

클래스만의 변수, 속성

class Car:
    '''class attributes tells us the state of class'''

    color = 'red'
    category = 'sports car'
    '''drive start'''
    def drive(self):
        print("I`m driving")
    '''accelate'''
    def accel(self, speed_up, current_speed=10):
        self.speed_up = speed_up
        self.current_speed = current_speed + speed_up
        print("speed up", self.speed_up, "driving at", self.current_speed)

다음과 같은 클래스가 있을때 클래스의 속성에 해당하는 color, category

 

메서드에 있는 self의 역할

self는 아래와 같은 형태의 역할을 자동으로 해주게 만들어져있다

아래와 같이 코드를 작성하는 것은 동작에 대한 예시일 뿐 따라해선 안된다

self가 없을 때 일어나는 일

인자를 받지 않는 것으로 코드했지만 self가 인자로 들어간 것을 확인할 수 있다

 

클래스와 인스턴스의 속성을 구분하지 못하면 생기는 일

class Test2:
    def run1(self, a):
        self.a = float(a) * 10
        print(self.a)
    
    def run2(self, b):
        b = float(b) * 10
        print(self.b)

t = Test2()
t.run1(1)
# 10
t.run2(1)

self.변수는 인스턴스, 그냥 변수는 클래스의 속성이 된다 명확한 구분과 사용이 필요하다

예시)

class Car:
    Manufacture = "India"

    def __init__(self, color, category="sedan"):
        self.color = color
        self.category = category

 

생성자(Constructor)

 

9. Classes — Python 3.8.12 documentation

9. Classes Classes provide a means of bundling data and functionality together. Creating a new class creates a new type of object, allowing new instances of that type to be made. Each class instance can have attributes attached to it for maintaining its st

docs.python.org

클래스 내에 다음과 같은 구조를 가지고 있다

def __init__(self):
    self.data = []

생성자 사용시의 활용

# Car class with constructor
class Car2:
    def __init__(self, color, category):
        self.color = color
        self.category = category
    
    def drive(self):
        print("I`m driving")
    
    def accel(self, speed_up, current_speed=10):
        self.speed_up = speed_up
        self.current_speed = current_speed + self.current_speed
        print("speed up", self.speed_up, "driving at", self.current_speed)
 
 car2 = Car2('yellow', 'sedan')
 car2.color
 # 'yellow'

함수처럼 디폴트 값을 줄 수도 있다

# default value is possible like function
class Car2:
    def __init__(self, color='red', category="sports car"):
        self.color = color
        self.category = category

 

클래스의 상속

다음과 같은 클래스가 있을 때

class Car:
    Manufacture = "India"

    def __init__(self, color='red', category='sedan'):
        self.color = color
        self.category = category
    
    def drive(self):
        print("I`m driving")
    
    def accel(self, speed_up, current_speed=10):
        self.speed_up = speed_up
        self.current_speed = current_speed + self.speed_up
        print("speed up", self.speed_up, "driving at", self.current_speed)

상속만 받으면 단 몇줄로도 클래스를 가져올 수 있다

# new class with no code
class NewCar(Car):
    pass

socar = NewCar()
socar.drive()
socar.accel(10)
# I`m driving
# speed up 10 driving at 20

필요한 속성만 추가해서 사용하는 것도 가능하다

# just class attribute change
class NewCar(Car):
    maker = "Porsche"

sportscar = NewCar()
sportscar.maker

 

상속이 주로 쓰이는 3가지

  • 메서드 추가하기
  • 메서드 오버라이드
  • Super class 호출하기( super() )

 

메서드 추가하기

# add method
class NewCar(Car):
    def autonomous_drive(self):
        print("Autonomous driving is on")

메서드 오버라이드

# override method
class NewCar(Car):
    def drive(self):
        print("even drive is auto")

슈퍼클래스 사용하기

# call super class, super class`s changed value will be affected to subclass
class NewCar(Car):
    def __init__(self, color, category, maker):
        super().__init__(color, category)
        self.maker
    
    def autonomous_drive(self):
        print("Autonomous driving is on")
    
    def accel(self, speed_up, level=1, current_speed=10):
        self.boost[level] = {1 : 0, 2 : 30, 3 : 50}
        self.speed_up = speed_up + self.boost[level]
        self.current_speed = current_speed + self.speed_up
        print("speed up", self.speed_up, "driving at", self.current_speed)

단순 기능의 상속 뿐만 아니라 부모 클래스의 필요한 속성을 가져와 사용할 수 있다

특히 변경되는 속성이더라도 알아서 가져오기 때문에 하드코딩 하지 않아도 된다

 

반응형