객체 : 클래스에서 선언된 틀 그대로 만들어진 실체이며, 자신의 고유와 상태, 이름, 행동을 가짐
인스턴스 : 클래스로 만든 객체
# 여기서 객체는 student, student 객체는 Oper의 인스턴스
class Oper:
def **init**(self):
self.res = 0
def plus(self, num):
self.res += num
return self.res
student1 = Oper()
student2 = Oper()
student3 = Oper()
구조
메서드는 함수와 동일하게 생성
메서드의 첫 번째 매개변수는 반드리 self로 지정
self : 인스턴스 자신을 의미, 인스턴스 내부의 속성을 다루기 위해 self 사용
class Class_Name:
def Method(self, ...):
Code
init : 생성자라고 하며, 객체를 생성하는 순간에 호출되는 특별한 메서드
self 매개변수에는 객체 a가 자동으로 전달되기 때문에 인자는 3개만 입력
class Person:
def __init__(self, name, sex, age):
self.name = name
self.sex = sex
self.age = age
def introduce(self):
print('이름 : %s' %self.name)
print('성별 : %s' %self.sex)
print('나이 : %d' %self.age)
a = Person('John', 'man', 21)
a.introduce()
# 이름 : John
# 성별 : man
# 나이 : 21
매직 메서드
클래스의 특정 동작을 커스터마이즈하거나 오버라이드하는데 사용
class MyList:
def __init__(self, elements):
self.elements = elements
def __len__(self):
return len(self.elements)
특정 인스턴스에 속성 추가
클래스에서 선언한 속성 말고도 생성된 객체에서 자신만의 속성 추가 가능
class Person:
def __init__(self, *args):
self.name = args[0]
self.sex = args[1]
self.age = args[2]
def introduce(self):
print('이름 : %s' %self.name)
print('성별 : %s' %self.sex)
print('나이 : %d' %self.age)
a = Person('John', 'man', 21)
b = Person('minsu', 'man', 21)
a.job = 'singer'
print(a.job) # singer
print(b.job) # AttributeError: 'Person' object has no attribute 'job'
비공개 속성 / 메서드
클래스 밖에서는 접근할 수 없도록 하는 기능
속성, 메서드 이름 앞에 __가 붙음
속성
class Person:
def __init__(self, name, sex, age, height):
self.name = name
self.sex = sex
self.age = age
self.__height = height
a = Person('John', 'man', 21, 180)
a.age += 1
print(a.age) # 22
a.__height += 2 # AttributeError: 'Person' object has no attribute '__height'
메서드
class Person:
def __init__(self, name, sex, age, height):
self.name = name
self.sex = sex
self.age = age
self.__height = height
def __hi(self):
print("Say hi!")
def hello(self):
self.__hi()
a = Person('John', 'man', 21, 180)
a.hello() # Say hi!
a.__hi() # AttributeError: 'Person' object has no attribute '__hi'
상속
super : 상속된 부모 클래스의 메서드를 호출
변수 앞에 _
# nn.Module의 init 메서드
def __init__(self) -> None:
"""
Initializes internal Module state, shared by both nn.Module and ScriptModule.
"""
torch._C._log_api_usage_once("python.nn_module")
self.training = True
self._parameters: Dict[str, Optional[Parameter]] = OrderedDict()
self._buffers: Dict[str, Optional[Tensor]] = OrderedDict()
self._non_persistent_buffers_set: Set[str] = set()
self._backward_hooks: Dict[int, Callable] = OrderedDict()
self._is_full_backward_hook = None
self._forward_hooks: Dict[int, Callable] = OrderedDict()
self._forward_pre_hooks: Dict[int, Callable] = OrderedDict()
self._state_dict_hooks: Dict[int, Callable] = OrderedDict()
self._load_state_dict_pre_hooks: Dict[int, Callable] = OrderedDict()
self._modules: Dict[str, Optional['Module']] = OrderedDict()
super 안에 현재 클래스 명시 유무 : 기능적으로 아무런 차이가 없다.
class MyModule(nn.Module):
def __init__(self,x):
super(MyModule,self).__init__()
self.x = x
class MyModule(nn.Module):
def __init__(self,x):
super().__init__()
self.x = x
상속 구조
class 부모클래스:
...내용...
class 자식클래스(부모클래스):
...내용...
‘Dataset’ Class를 상속받아 매직 메서드를 활용하여 오버라이딩을 한 것으로 보임
class ForceDataset(Dataset):
def __init__(self, df, mode='test'):
self.df = df
self.mode = mode
def __len__(self):
return len(self.df)
def __getitem__(self, idx):
pos_x = self.df.loc[idx, 'position_x']
pos_y = self.df.loc[idx, 'position_y']
pos_z = self.df.loc[idx, 'position_z']
inputs = torch.tensor([pos_x, pos_y, pos_z], dtype=torch.float32)
if not self.mode == 'test':
label = torch.tensor(self.df.loc[idx, 'force'], dtype=torch.float32)
return inputs, label
else:
return inputs
참고 링크