python 기초 - class

2020. 4. 18. 03:23python

선언

class 클래스명:
	함수
    함수
    
Class UserInfo: 
	pass
    def__init__(self.name):#인스턴스 변수
    self.name = name
    def user_info_p(self):#인스턴스화
    	print("Name:", self.name)
#네임스페이스: 객체를 인스턴스화 할 때 저장된 공간
#클래스 변수: 직접 삳용 가능, 객체보다 먼저 생성
#인스턴스 변수: 객체마다 별도로 존재, 인스턴스 생성 후 사용

user1 = UserInfo("kim")#인스턴스 생성했으므로 사용 가능.
print(user1.name) #-> kim
user1.user_info_p() #-> Name: kim
print(user1.__dict__) #->{'name': 'kim'}

self의 이해

class SelfTest:
	def function1(): #클래스 메소드
    
    def function2(self): #인스턴스 매소드
    	#~~~~~~~~~~~~~ #인스턴스화 됨.
        
self_test = SelfTest()
self_test.function1() #-> ERROR!
selTest.fuction1() #-> OK

클래스변수(self x), 인스턴스 변수(self o)

class Warehouse:
#클래스 변수
	stock_num =0
    def__init__(self,name):
    	self.name = name
        Warehouse.stock_num +=1
    def _del_(self):
    	warehouse.stock_num -=1
        
user1 = Warehouse('kim')
user2 = Warehouse('Park')
user2 = Warehouse('Lee')
printf(user1.__dict__) #-> {name:kim}
#클래스 네임스페이스, 클래스 변수(공유)
printf(WareHouse.__dict__) #->클래스 네임스페이스, 클래스 변수(공유), stock_num:2 까지 출력

print(user1.name) #-> kim
printf(user1.stock_num) #->3, 자기 네임스페이스에 없으면 클래스의 네임스페이스에서 변수를 찾음

del user1

printf(user1.stock_num) #->2

#네임스페이스 : 객체를 인스턴스화 할 때 저장된 공간
#클래스 변수: 직접 사용 가능, 객체 보다 먼저 생성
#인스턴스 변수: 객체마다 별도로 존재, 인스턴스 생성 후 사용

상속, 다중상속

#슈퍼클래스(부모), 서브클래스(자식) -> 모든 속성, 메소드 사용 가능

class Car:
	"""Parent Class"""
    def __init__(self, tp, color):
    	self.type = tp
        self.color = color
        
    def show(self):
    	return 'car class "show method!"'
        
class BMW(car): #car의 모든 속성을 사용 가능해짐
	"""sub class"""
    def __init__(self, car_name, tp, color):
    	super().__init__(tp, color)
        self.car_name = car_name
        
    def show_model(self) -> None:
    	return "your car name: %s" % self.car_name

class Benz(car): #car의 모든 속성을 사용 가능해짐
	"""sub class"""
    def __init__(self, car_name, tp, color):
    	super().__init__(tp, color)
        self.car_name = car_name
        
    def show_model(self) -> None:
    	return "your car name: %s" % self.car_name
    def show(self):
    print(sueper().show())#parent call
    return 'car info : %s %s %s' % (self.car_name, self.type, self.color)
    
#일반 사용
model1 = BMW('520d', 'sedan', 'red')

print(model1.color) #super -> red
print(model1.type) #sueper -> sedan
print(model1.car_name) #sub -> 520d
print(model1.show()) #super -> car class "show method!
print(model1.show_model()) #sub -> your car name: 520d
print(model1.__dict__) #{'type': 'sedan', 'color': 'red'.........}


# Method Overriding(오버라이딩)
model2 = Benz("220d", 'suv', 'black')
print(model2.show()) #super의 show가 아닌 sub에 있는 show를 사용

#parent Method call
model3 = benz('350d', 'sedan', 'red') # -> super, sub 둘 다 출력

#Inheritance Info(상속정보를 list타입으로)
print(BMW.mro()) #-> [<class '__main__.BMW'>, <class '__main__.car'>, <class 'object'>]#상속정보를 불러들임

 
#다중상속 2

class x():
	pass

class y():
	pass

class z():
	pass

class A(x,y):
	pass

class B(y,z):
	pass
class M(B, A, Z):
	pass


print(M.mro()) #-> m, b, a, x, y, z, object