TIL-day50

yo·2020년 7월 31일
0

python any

syntax

any(iterable)
-iterable objects(list, typle, dictionary)

example

>>> a = [False, 0, None]
>>> any(a)
False
>>> b = [False, 0, None, 1]
>>> any(b)
True

python 특정 범위의 숫자를 중복 없이 random하게 뽑기

1~25까지의 숫자를 랜덤하면서, 중복 없이 뽑아보자.


import random
random.sample(range(1,26), 25)

python 복수의 요소를 리스트에 추가하기 (extend함수 활용)

ls = []
ls1 = [1,2,3,4]
ls.extend(ls1)
print(ls)
[1,2,3,4]

코드잇 객채 강의

-객체: '속성'과 '행동'을 가진 것.
-객체지향 프로그래밍: 프로그램을 여러 개의 독립된 객체들과 그 객체들 간의 상호작용으로 파악하는 프로그래밍 접근법, 쉬운말로 프로그램을 객체와 객체의 소통으로 보는 것.
-객체지향 프로그래밍으로 프로그램을 만들려면,
1) 프로그램에 어떤 객체들이 필요할지 정한다.
2) 객체들의 속성, 행동 정한다.
3) 객체들이 서로 어떻게 소통할지 정한다.

-객체지향의 4가지 개념
Chapter 1: 추상화(Abstraction)
Chapter 2: 캡슐화(Encapsulation)
Chapter 3: 상속(Inheritance)
Chapter 4: 다형성(Polymorphism)

-객체 설계의 원칙 5가지
Chapter 1: 단일 책임 원칙 (Single Responsibility Principle)
Chapter 2: 개방 폐쇄 원칙 (Open-closed Principle)
Chapter 3: 리스코프 치환 원칙 (Liskov Substitution Principle)
Chapter 4: 인터페이스 분리 원칙 (Interface Segregation Principle)
Chapter 5: 의존 관계 역전 원칙 (Dependency Inversion Principle)

클래스와 인스턴스

-클래스(붕어빵 틀)로 인스턴스(붕어빵)를 만든다 = 크래스로 객체를 만든다.
-객체 = 인스턴스
-클래스 명은 항상 대문자로 시작(예 class User:)
클래스 만들기 예시

class User:
	pass
user1 = User()
user2 = User()
user3 = User()

인스턴스 변수

class User:
	pass
user1 = User()
user2 = User()
user3 = User()

user1.name = "이소룡"
user1.email = "asdf@asdf.com"
user1.password = "12345"

user2.name = "김김김"
user2.email = "asas1212@asas.com"
user2.password = "112234"

user3.name = "비비빅"
user3.email = "qqqq22@www.com"
user3.password = "qw2414"

인스턴스 메소드

-객체의 속성은 변수로, 행동은 함수로 나타낸다.

-메소드의 종류
1)인스턴스 메소드
2)클래스 메소드
3)정적 메소드

인스턴스 메소드
: 인스턴스 변수를 사용하거나, 인스턴스 변수에 값을 설정하는 메소드
예시)

class User:
	def say_hell(some_user):
    	print("안녕 난{}야!".format(some_user.name))

user1 = User()
user1.name = "이소룡"

인스턴스 메소드의 특별한 규칙

-인스턴스 메소드 사용법:
1)클래스이름.메소드 이름(인스턴스) User.say_hello(user1)
2)인스턴스 이름.메소드 이름() user1.say_hello()

1)은 클래스에서 메소드를 호출했고,
2)는 인스턴스에서 메소드를 호출했다.
2)는 메소드 인자로 인스턴스 자기 자신에 자동할당된다. 즉 parameter를 할당할 필요가 없다.
만약 2)방식에서 parameter를 할당하면?
user1.say_hello(user1)
결과: TypeError: say_hello() takes 1 positional argument but 2 were given
즉, user1.say_hello(user1, user1)과 같은 결과다.

class User:
	def say_hell(some_user):
    	print("안녕 난{}야!".format(some_user.name))
        
    def login(some_user, my_email, my_password):
    	if (some_user.email == my_email and some_user.password == my_password):
        	print("로그인 성공")
        else:
        	print("로그인 실패")

user1 = User()
user1.name = "이소룡"
user1.email = "asdf@gmail.com"
user1.password = "12345"

user1.login("asdf@gmail.com", "12345")

self를 사용합시다

인스턴스 메소드 첫 번째 parameter이름은 꼭 self로 쓰기

class User:
	def say_hell(some_user):
    	print("안녕 난{}야!".format(some_user.name))
        
    def login(self, my_email, my_password):
    	if (self.email == my_email and self.password == my_password):
        	print("로그인 성공")
        else:
        	print("로그인 실패")

인스턴스 변수와 같은 이름을 갖는 파라미터

initialize method

__init__ method, __str__method

class User:
	pass

user1 = User()
user1.name = "이소룡"
user1.email = "asdf@gmail.com"
user1.password = "12345"

위처럼 변수를 일일히 설정하던걸, init method를 통해 한번에 할 수 있다. 때문에 클래스에선 보통 __init__method를 꼭 작성한다.

class User:
	def __init__(self, name, email, password):
    	self.name = name
        self.email = email
        self.password = password
    
	def __str__(self):
    	return "사용자: {}, 이메일: {}, 비밀번호 ****".format(self.name, self.email)
        
user1 = User("Kim", "a@gmail.com", "asd123"

__str__이 없는 상태로 print(user1)을 찍어보면 아래처럼 메모리 위치 등이 나온다.
<__main__.User object at 0x1018a90f0>
근데 이렇게 말고, 내가 원하는user의 정보를 나오게 하고 싶으면 __str__을 쓰면 된다.

클래스 변수

:한 클래스의 모든 인스턴스가 공유하는 속성
-클래스 변수의 값 읽기
1. 클래스 이름.클래스 변수 이름
2. 인스턴스 이름.클래스 변수 이름
-클래스 변수이 값 설정하기
클래스 이름.클래스 변수 이름

위에서 User클래스를 만들었다.
총 유저 인스턴스의 개수를 나타내는 변수는 어떻게 만들까?
이 변수는 여태 만든 변수랑 성격이 다르다.
각각 인스턴스마다 값이 다르지 않고, 모든 인스턴스가 이 값에 영향을 주고, 공유한다.
이런 변수를 클래스 변수라 한다.
클래스 변수는 클래스를 정의하고 바로 아래에다 써주면 된다.
지금 예시에선 count = 0이라 정의해주자.
__init메소드는 인스턴스가 생성될 때마다 자동으로 호출되는 메서드이므로, 이 안에 User.count +=1 를 써주면 우리의 과제가 해결된다.

class User:
	count = 0
	def __init__(self, name, email, password):
    	self.name = name
        self.email = email
        self.password = password
        
        User.count += 1

user1 = User("김", "a@gmail.com", "as1234")
user2 = User"이", "b@gmail.com", "asdf124")

print(User.count)
print(user1.count)
print(user2.count)

print 결과
2
2
2
클래스 변수의 값을 변경할 땐,
User.count = 5 와 같은 형식으로 해야한다.
만약, user1.count = 5 처럼 설정하면 클래스 변수가 아닌, user1의 instance변수로 할당된다.

Decorator

Class Method

클래스 메소드의 규칙
첫 번째 파라미터의 이름은 꼭 cls로 쓰기

cls.count = User.ocunt

class User:
	count = 0
	def __init__(self, name, email, password):
    	self.name = name
        self.email = email
        self.password = password
        
        User.count += 1

	@classmethod
    def number_of_users(cls):
    	print("총 유저 수는:{}입니다".format(cls.count))
        
        
user1 = User("김", "a@gmail.com", "as1234")
user2 = User"이", "b@gmail.com", "asdf124")

User.number_of_users()
user1.number_of_users()

아래 호출한 둘 다 결과는 같다. "총 유저수는 2명입니다"
인스턴스 메소드는
1) User.say_hello(user1)
2) user1.say_hello()
둘 중 한 가지 방법으로 호출된다. 2)처럼 instance에서 호출시 parameter로 자기 자신이 들어가기에 비워둬도 된다.

클래스 메소드의 경우
1)User.number_of_users()
2)user1.number_of_users()
두가지가 가능한데, 인자는 필요없다. 자동으로 class가 인자로 들어가기 때문이다.

class method vs instance method

class 변수를 사용하면 calss method,
instance 변수를 사용하면 instance method
Q. 클래스 변수와 인스턴스 변수 둘 다 쓴다면?
A. 인스턴스 메소드!(인스턴스 메소드는 인스턴스 변수, 클래스 변수 모두 사용 가능, 클래스 메소드는 인스턴스 변수 사용 불가.)

-인스턴스가 하나도 없을 때에도 사용할 메소드라면 class method로 만들어야 함.
Class Method 활용
정적 메소드
객체 만드는 법

profile
Never stop asking why

0개의 댓글