C++/Javaμμμ Classμ μ°¨μ΄μ
- ν΄λμ€ instance μμ±μ new ν€μλκ° μλ€. ν¨μνΈμΆκ³Ό κ°μ λ°©μμ μ¬μ©νλ€.
- λ©μλ μ€λ²λ‘λ©μ΄ μλ€.
- λ©μλ μ€λ²λ‘λ©: νλμ ν΄λμ€μμ λ©μλ μ΄λ¦μ κ°κ³ , μΈμλ₯Ό λ€λ₯΄κ² νλ νν
- κ°λ³μΈμλ₯Ό νμ©ν΄ μ¬μ©νλ€. κ°λ³μΈμλ μΈμ μμ
*
λ₯Ό λΆμ¬μ μ¬μ© (ν¨μμ°Έκ³ ) def add(self, *num)
- class μμ±κ³Ό instance μμ±μ ꡬλΆν΄μ μ μν΄μ€μΌνλ€
- C#, Javaλ λ€μ€μμμ΄ λΆκ°λ₯νμ§λ§ python, c++μ λ€μ€μμμ΄ κ°λ₯νλ€.
class μμ±κ³Ό instance μμ± κ΅¬λΆνκΈ°
class μμ±μ classλ₯Ό importν ν μ¬μ©ν μ μλ€.
- class λ³μλ class λ΄λΆμμ μ μν΄μ€λ€.
- class method μ μμ
@classmethod
λ°μ½λ μ΄ν°λ₯Ό νμν΄μ€λ€. - class methodλ class μμ±μμ μλ―Ένλ clsλ₯Ό 첫λ²μ§Έ 맀κ°λ³μλ‘ λ°λλ€. (λ€λ₯Έ μ΄λ¦λ κ°λ₯νλ€.)
instance μμ±μ classμ instanceλ₯Ό μμ±ν λ μμ±λλ©°, κ° instanceμμλ§ μ¬μ©ν μ μλ€.
- instance λ³μλ μμ±μ μν μ νλ
__init__
ν¨μμμ μ μν΄μ€λ€. - instance methodλ instance μμ±μμ μλ―Ένλ selfλ₯Ό 첫λ²μ§Έ 맀κ°λ³μλ‘ λ°λλ€.
def __init__(self, argument)
λ C++μμμ μμ±μμ κ°λ€.
- μΌλ°μ μΌλ‘λ
__init__
ν¨μλ§ μ€λ²λΌμ΄λ©ν΄μ instance μ΄κΈ°νμ μ΄μ©νλ€. - μμΈνλ instance μμ±μ
__new__
ν¨μλ₯Ό νΈμΆν΄ instance μμ±ν λΉμ νλ€.__new__
ν¨μκ°__init__
ν¨μλ₯Ό νΈμΆνκ³ , instanceμμ μ¬μ©ν μ΄κΈ°κ°λ€μ μ΄κΈ°ννλ€.
class, instance μμ±μ ꡬλΆνκΈ° μν΄ simpleClass.py
μ class Cλ₯Ό μ μνκ³ , 컀맨λλΌμΈμμ class C, instance f, gμ μμ±λ€μ νμΈνλ€.
# simpleClass.py
class C:
class_attr = [] # class μμ±
def __init__(self):
self.instance_attr = [] # instance μμ±
def add_instance_attr(self, number): # instance method
self.instance_attr.append(number)
@classmethod
def add_class_attr(cls, number): # class method
C.class_attr.append(number)
class μμ± νμΈνκΈ°
>>> from simpleClass import C
>>> C.class_attr # ν΄λμ€ μμ±
[]
>>> C.add_class_attr(7) # ν΄λμ€ λ©μλ
>>> C.class_attr
[7]
>>> C.add_instance_attr(5) # instance methodλ₯Ό λΆλ¬μ¬ κ²½μ° TypeErrorκ° λ°μνλ€.
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unbound method add_instance_attr() must be called with C instance as first argument (got int instance instead)
instance μμ± νμΈνκΈ°
>>> f = C()
>>> g = C()
>>> f.add_instance_attr(5)
>>> f.add_class_attr(5) # instanceλ class ν¨μλ₯Ό μ¬μ©ν μ μλ€.
>>> print f.instance_attr, f.class_attr # class_attrμ 곡μ λλ€.
[5] [7, 5]
>>> g.add_instance_attr(3)
>>> g.add_class_attr(3)
>>> print g.instance_attr, g.class_attr
[3] [7, 5, 3]
Class μμ
μμμ Parent classμ λ΄μ©μ λ°νμΌλ‘ μΆκ°μ μΈ κΈ°λ₯μ ꡬννκΈ° μν΄ μ¬μ©λλ€. μμ ν΄λμ€μ instance μμ±μ μμλ°μ λΆλͺ¨ν΄λμ€μ class λ³μ, class methodλ μμ ν΄λμ€μ instanceμμ λ°λ‘ μ κ·Ό κ°λ₯νλ€. μ΄λ λΆλͺ¨ ν΄λμ€μ class μμ±κ³Ό κ°μ κ°μ΄λ€.
μμ ν΄λμ€μμ μμ±μλ₯Ό λ§λ€μ§ μμ κ²½μ°μ μλ‘ λ§λ€ κ²½μ°μ μ°¨μ΄κ° λ°μνλ€. μμ ν΄λμ€μμ μμ±μλ₯Ό λ§λ€μ§ μμ κ²½μ°, μμ ν΄λμ€μ instance μμ±μ λΆλͺ¨ ν΄λμ€μ μμ±μλ₯Ό μλμΌλ‘ νΈμΆνλ€.
μμ ν΄λμ€μμ μμ±μλ₯Ό μλ‘ λ§λ κ²½μ°, λΆλͺ¨ ν΄λμ€μ μμ±μλ μλμΌλ‘ νΈμΆλμ§ μλλ€. λΆλͺ¨ ν΄λμ€μ μμ±μλ₯Ό νΈμΆνκΈ° μν΄μλ super() ν¨μλ₯Ό ν΅ν΄μ νΈμΆνκ±°λ, λΆλͺ¨ ν΄λμ€λͺ μ μ΄μ©ν΄ μ§μ μμ±μλ₯Ό νΈμΆν΄μΌνλ€. λ ν¨μμ μ°¨μ΄λ μλμ κ°λ€.
Parent.__init__(self)
λ°©μμ λΆλͺ¨ν΄λμ€μ μμ±μ λ©μλλ₯Ό μ§μ μ°Έκ³ νκΈ° λλ¬Έμ, λΆλͺ¨ν΄λμ€κ° λ³κ²½λ κ²½μ°Child(Parent)
,Parent.function()
λ λ€ λ³κ²½ν΄μ€μΌνλ€.super(Child, self).__init__
λ°©μμ λΆλͺ¨ν΄λμ€λ₯Ό μλμΌλ‘ μΈμνλ―λ‘, λΆλͺ¨ ν΄λμ€λ₯Ό λ³κ²½ν κ²½μ°,Child(Parent)
λΆλΆλ§ λ³κ²½ν΄μ£Όλ©΄ λλ€.- μμ±μ μ΄κΈ°νμ
super()
ν¨μλ μλμΌλ‘ selfκ° μ λ¬λμ§λ§, μ§μ νΈμΆμμλ selfλ μ λ¬ν΄μΌνλ€.
μλ μμλ μμ ν΄λμ€μμ μμ±μλ₯Ό μλ‘ λ§λ€κ³ , λΆλͺ¨ ν΄λμ€μ μμ±μλ₯Ό νΈμΆνλ μμ μ΄λ€.
곡ν΅μ μΌλ‘ μμλ°μ class λ³μ, class ν¨μ, instance ν¨μλ μ¬μ©κ°λ₯νλ€.
- μμ ν΄λμ€μμ μμ±μλ₯Ό λ§λ€μ§ μμ κ²½μ°
- μμ ν΄λμ€ instanceμΈ childμ instance μμ±μΌλ‘ instance_attrμ΄ μμ±λμ΄ μ¬μ©κ°λ₯νλ€.
- μμ ν΄λμ€μμ μμ±μλ₯Ό λ§λ€κ³ λΆλͺ¨ ν΄λμ€μ μμ±μλ₯Ό νΈμΆνμ§ μμ κ²½μ°
- μμ ν΄λμ€ instanceμΈ childμ instance μμ±μΌλ‘ child_instance_attrλ§ μμ±λλ€.
- λΆλͺ¨ ν΄λμ€ instance μμ±μκ° νΈμΆλμ§ μμκΈ° λλ¬Έμ instance_attrμ μμ±λμ§ μλλ€.
- μμ ν΄λμ€μμ μμ±μλ₯Ό λ§λ€κ³ λΆλͺ¨ ν΄λμ€μ μμ±μλ₯Ό νΈμΆν κ²½μ° (μλ μμμ κ°λ€)
- μμ ν΄λμ€ instanceμΈ childμ instance μμ±μΌλ‘ child_instance_attr, instance_attrμ΄ μμ±λλ€.
class Parent(object):
class_attr = []
def __init__(self):
self.instance_attr = []
def add_instance_attr(self, number):
print("parent instance function")
self.instance_attr.append(number)
@classmethod
def add_class_attr(cls, number):
Parent.class_attr.append(number)
class Child(Parent):
child_attr = []
def __init__(self):
super(Child, self).__init__() # Parent.__init__(self) μ κ°λ€.
self.child_instance_attr = []
def add_child_instance_attr(self, number):
self.child_instance_attr.append(number)
@classmethod
def add_child_class_attr(cls, number):
Child.child_attr.append(number)
>>> child = Child()
>>> child.add_child_class_attr(1)
>>> child.add_child_instance_attr(2)
>>> child.add_class_attr(3) # parent class function
>>> print "child class attr:", child.child_attr
child class attr: [1] [1]
>>> print "child instance attr:", child.child_instance_attr
child instance attr: [2]
>>> print "parent class attr:", child.class_attr, Parent.class_attr # parent class var
parent class attr: [3] [3]
>>> child.add_instance_attr(4) # parent instance function
>>> print "parent instance attr:", child.instance_attr
parent instance function
parent instance attr: [4]
>>> print child.__dict__
{'instance_attr': [4], 'child_instance_attr': [2]}
λ€μ€μμ
Python μμλ λ€μ€ μμμ μ§μνλ€. λ€μκ³Ό κ°μ ννλ‘ λ€μ€μμμ ν μ μλ€.class DerivedClassName(Base1, Base2, Base3)
λ€μ€μμμ κ²½μ° super()λ₯Ό μ΄μ©νλ©΄ 첫λ²μ§Έ λΆλͺ¨λ§μ μλ―Έν΄, κ°κ°μ λΆλͺ¨λ₯Ό μ¬μ©ν μ μλ€. λΆλͺ¨μ ν΄λμ€λͺ μ μ΄μ©ν΄ μ§μ μμ±μλ₯Ό νΈμΆν΄μΌνλ€.
λ€μ€μμμ λ°μ Parentλ€μ΄ κ°μ μ΄λ¦μ ν¨μλ₯Ό κ°κ³ μμ κ²½μ°, 첫λ²μ§Έ λΆλͺ¨μ λ©μλλ§ λΆλ¬μμ§κΈ° λλ¬Έμ λ°λ‘ μ μν΄μ€μΌνλ€.
class ParentOne(object):
def __init__(self):
self._one = 1
def func(self):
print('ParentOne.func')
class ParentTwo(object):
def __init__(self):
self.two = 2
def func(self):
print('ParentTwo.func')
class Child(ParentOne, ParentTwo):
def __init__(self):
ParentOne.__init__(self)
ParentTwo.__init__(self)
self._three = 3
def oneFunc(self):
ParentOne.func(self)
def twoFunc(self):
ParentTwo.func(self)
if __name__ == "__main__":
child = Child()
print(child.__dict__)
child.oneFunc()
child.twoFunc()
μ€ν κ²°κ³Ό >
{'_one': 1, 'two': 2, '_three': 3}
ParentOne.func
ParentTwo.func
λ©μλ μ€λ²λΌμ΄λ©κ³Ό λ€μ λ§ΉκΈλ§
λ©μλ μ€λ²λΌμ΄λ©(method overriding)μ λΆλͺ¨ ν΄λμ€μ μλ methodμ κ°μ μ΄λ¦μ methodλ₯Ό μμ ν΄λμ€μμ μλ‘κ² κ΅¬νν΄μ μ¬μ©νλ κ²μ΄λ€.
νμ ν΄λμ€μμ μ μλ μ΄λ¦λ€κ³Όμ μΆ©λμ νΌνκΈ° μν΄μ name manglingμ μ¬μ©νλ€. μ μν ν¨μκ° ν΄λμ€λ§λ€ μ΄λ¦μ΄ κ²ΉμΉμ§ μκ² μλμΌλ‘ λ°κΎΈμ΄μ€λ€.
μλ μ½λμμ class A, Bμμ μ μν __double_method
λ _A__double_method
, _B__double_method
λ‘ λ³κ²½λλ€.
- μ΄λ° κ²½μ°κ° λ°μνλ μ½λλ₯Ό μμ±νμ§ μλ κ²μ΄ μ’λ€,,
class A:
def _single_method(self):
pass
def __double_method(self):
print("A' double method")
class B(A):
def __double_method(self):
print("B' double method")
print(dir(A))
print(dir(B))
b = B()
b._A__double_method() # class A μμ μ μν ν¨μκ° λΆλ¬μμ§λ€.
b._B__double_method() # class B μμ μ μν ν¨μκ° λΆλ¬μμ§λ€.
μ€ν κ²°κ³Ό >
['_A__double_method', '__doc__', '__module__', '_single_method']
['_A__double_method', '_B__double_method', '__doc__', '__module__', '_single_method']
A' double method
B' double method
'π Algorithm > Python' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Python] λ°μ΄ν° νμ - List, Dictionary, JSON (0) | 2020.12.07 |
---|---|
[Python] Lambda νμ© - map, filter, reduce ν¨μ (0) | 2020.12.07 |
[Python] ν·κ°λ¦¬λ λ¬Έλ² μ 리 (0) | 2020.12.07 |