any(iterable)
-iterable objects(list, typle, dictionary)
>>> a = [False, 0, None]
>>> any(a)
False
>>> b = [False, 0, None, 1]
>>> any(b)
True
1~25까지의 숫자를 랜덤하면서, 중복 없이 뽑아보자.
import random
random.sample(range(1,26), 25)
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")
인스턴스 메소드 첫 번째 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("로그인 실패")
__init__
method, __str__
methodclass 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변수로 할당된다.
클래스 메소드의 규칙
첫 번째 파라미터의 이름은 꼭 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 변수를 사용하면 calss method,
instance 변수를 사용하면 instance method
Q. 클래스 변수와 인스턴스 변수 둘 다 쓴다면?
A. 인스턴스 메소드!(인스턴스 메소드는 인스턴스 변수, 클래스 변수 모두 사용 가능, 클래스 메소드는 인스턴스 변수 사용 불가.)
-인스턴스가 하나도 없을 때에도 사용할 메소드라면 class method로 만들어야 함.
Class Method 활용
정적 메소드
객체 만드는 법