class MyObject:
def __init__(self):
self.public_field = 5
self.__private_field = 10
def get_private_field(self):
return self.__private_field
foo = MyObject()
foo.__private_field
>>>
Traceback ...
AttributeError: 'MyObject' object has no attribute '__private_fieldโ- ๋ฐ์ค 2๊ฐ๋ก ์์ํ๋ ์ ํธ๋ฆฌ๋ทฐํธ๋ private
- ์ธ๋ถ์์ private attribute ์ ๊ทผ์ ์์ธ ๋ฐ์
class MyParentObject:
def __init__(self):
self.__private_field = 71
class MyChildObject(MyParentObject):
def get_private_field(self):
return self.__private_field
baz = MyChildObject()
baz.get_private_field()
>>>
Traceback ...
AttributeError: 'MyChildObject' object has no attribute '_MyChildObject__private_fieldโ-
ํ์ ํด๋์ค์์ ๋ถ๋ชจ ํด๋์ค์ private attribute ๋ ์ ๊ทผํ ์ ์์
-
python ์์์ private attribute ์ฒ๋ฆฌ ๋ฐฉ์
- ์ด๋ฆ์ ๋ณ๊ฒฝํจ
- ex.
MyChildObject์__private_field๋_MyChildObject__private_field๋ก ๋ณ๊ฒฝ๋จ
- ex.
- ๊ทธ๋ฌ๋ฏ๋ก ํด๋์ค๊ฐ ๋ค๋ฅธ ์์น์์ ์ ๊ทผํ๊ฒ ๋๋ฉด ์ ์ ์๋ ์ด๋ฆ์ ์ ํธ๋ฆฌ๋ทฐํธ๋ก ๋ณํ๋์ด ์์ธ๊ฐ ๋ฐ์ํจ
- ์ด๋ฆ์ ๋ณ๊ฒฝํจ
-
๋ค์๊ณผ ๊ฐ์ด ์ ๊ทผ ์ ์์ธ ๋ฐ์ ์ํจ
def __init__(self):
self.__private_field = 71
class MyChildObject(MyParentObject):
def get_private_field(self):
return self.__private_field
baz = MyChildObject()
assert baz._MyParentObject__private_field == 71-
python ์์ private ์ ํธ๋ฆฌ๋ทฐํธ๋ฅผ ์๊ฒฉํ๊ฒ ์ ํํ์ง ์์
-
python ๋ชจํ
๊ฐ๋ฐ์๊ฐ ํ๊ณ ์ถ์ ์ผ์ ์ธ์ด๊ฐ ์ ํํ๋ฉด ์๋๋ค
ํน์ ๊ธฐ๋ฅ์ ํ์ฅํ ์ง์ ์ฌ๋ถ๋ ๊ฐ๋ฐ์๊ฐ ๊ณ ๋ คํด์ผ ํ ์ผ, ์ด๋ก ์ธํ ์ฑ ์์ ๋คํ๋ฉด ๋จ
-
ํด๋์ค๋ฅผ ์์ฑํ ์ฌ๋์ด ์๊ธฐ์น ๋ชปํ๊ฒ ํ์ฅํ ์ ์๋๋ก ์ด์ด๋ ์ผ๋ก์จ ์ป์ ์ ์๋ ์ฅ์ ์ด ๊ทธ๋ก ์ธํด ๋ฐ์ํ ์ ์๋ ๋จ์ ๋ณด๋ค ํฌ๋ค๊ณ ์๊ฐ
-
์ ํธ๋ฆฌ๋ทฐํธ์ ์ ๊ทผํ ์ ์๋ ์ธ์ด ๊ธฐ๋ฅ์ ๋ํ ํ ์ ์ ๊ณตํจ
__getattr____getattribute____setattr__
-
-
python ์ ๋ด๋ถ์ ๋ชฐ๋ ์ ๊ทผํจ์ผ๋ก์จ ์๊ธธ ์ ์๋ ํผํด๋ฅผ ์ค์ด๋๋ฐ ์์ด์๋ ์คํ์ผ ๊ฐ์ด๋์ ๋ช ๋ช ๊ท์ฝ์ ์งํฌ ๊ฒ์ ๋น๋ถํจ
-
๋ค์๊ณผ ๊ฐ์ด ์ค๊ฐ์
MyStringClassํด๋์ค๊ฐ ์ถ๊ฐ๋์๊ณMyIntegerSubclass์ ๋ถ๋ชจ๊ฐ ๋ณ๊ฒฝ๋์๋ค๊ณ ํ๋ฉดget_value์ ๋ฐํ ํํ์์ ํ๋ฆฐ ํํ์ด ๋๋ฒ๋ฆผ
class MyBaseClass:
def __init__(self, value):
self._ _value = value
def get_value(self):
return self._ _value
class MyStringClass(MyBaseClass):
def get_value(self):
return str(super().get_value()) # ๋ณ๊ฒฝ๋จ
class MyIntegerSubclass(MyStringClass):
def get_value(self):
return int(self._MyStringClass__value) # ๋ณ๊ฒฝ๋์ง ์์- ์ด ๊ฒฝ์ฐ ๋ถ๋ชจ ํด๋์ค์ชฝ์์ protected ์ ํธ๋ฆฌ๋ทฐํธ๋ฅผ ์ฌ์ฉํ๊ณ ์์ธ๋ฅผ ๋ฐ์์ํค๋ ํธ์ด ๋ ๋์
- ๋ชจ๋ protected ํ๋์ ์ค๋ช ์ ์ถ๊ฐํ๊ณ ์ด๋ค ํ๋๋ฅผ ํ์ ํด๋์ค์์ ๋ณ๊ฒฝํ ์ ์๊ณ ์ด๋ค ํ๋๋ฅผ ์ฌ์ฉํ์ง ๋ง์์ผ ํ ์ง ๋ช ์ํด์ผ ํจ
class MyStringClass:
def __init__(self, value):
# ์ฌ๊ธฐ์ ๊ฐ์ฒด์๊ฒ ์ฌ์ฉ์๊ฐ ์ ๊ณตํ ๊ฐ์ ์ ์ฅํ๋ค
# ์ฌ์ฉ์๊ฐ ์ ๊ณตํ๋ ๊ฐ์ ๋ฌธ์์ด๋ก ํ์
๋ณํ์ด ๊ฐ๋ฅํด์ผ ํ๋ฉฐ
# ์ผ๋จ ํ๋ฒ ๊ฐ์ฒด ๋ด๋ถ์ ์ค์ ๋๊ณ ๋๋ฉด
# ๋ถ๋ณ ๊ฐ์ผ๋ก ์ทจ๊ธ๋ผ์ผ ํ๋ค
self._value = value
...- ์์ ํด๋์ค๊ฐ ์ค์๋ก ๋ถ๋ชจ ํด๋์ค๊ฐ ์ด๋ฏธ ์ ์ํ ์ ํธ๋ฆฌ๋ทฐํธ๋ฅผ ์ ์ํ์์ ๊ฒฝ์ฐ ์ถฉ๋ ๋ฐ์
class ApiClass:
def __init__(self):
self._value = 5
def get(self):
return self._value
class Child(ApiClass):
def __init__(self):
super().__init__()
self._value = 'hello' # ์ถฉ๋
a = Child()
print(f'{a.get()} ์ {a._value} ๋ ๋ฌ๋ผ์ผ ํฉ๋๋ค.')
>>>
hello ์ hello ๋ ๋ฌ๋ผ์ผ ํฉ๋๋ค.- ์ด๋ฐ ๋ฌธ์ ์ํ์ฑ์ ์ค์ด๊ธฐ ์ํด ๋ถ๋ชจ ํด๋์ค์์ ์ ํธ๋ฆฌ๋ทฐํธ ์ด๋ฆ ๊ฒน์นจ์ ํด๊ฒฐํ๊ธฐ ์ํด ๋น๊ณต๊ฐ ์ ํธ๋ฆฌ๋ทฐํธ๋ฅผ ์ฌ์ฉํ ์ ์์
class ApiClass:
def __init__(self):
self.__value = 5 # ๋ฐ์ค ๋ ๊ฐ#!
def get(self):
return self.__value # ๋ฐ์ค ๋ ๊ฐ#!
class Child(ApiClass):
def __init__(self):
super().__init__()
self._value = 'hello' # OK!
a = Child()
print(f'{a.get()} ์ {a._value} ๋ ๋ฌ๋ผ์ผ ํฉ๋๋ค.')
>>>
5 ์ hello ๋ ๋ฌ๋ผ์ผ ํฉ๋๋ค.- python ์์๋ private ์ ํธ๋ฆฌ๋ทฐํธ๋ฅผ ์์ ํด๋์ค๋ ํด๋์ค ์ธ๋ถ์์ ์ฌ์ฉํ์ง ๋ชปํ๋๋ก ์๊ฒฉํ๊ฒ ๊ธ์งํ์ง ์์
- private ์ ํธ๋ฆฌ๋ทฐํธ๋ฅผ ์ฌ์ฉํ์ฌ ํ์ ํด๋์ค์์ ํด๋น ์ ํธ๋ฆฌ๋ทฐํธ๋ฅผ ์ฌ์ฉํ์ง ๋ชปํ๋๋ก ๋ง๊ธฐ๋ณด๋ค๋ ํด๋น ์ ํธ๋ฆฌ๋ทฐํธ๋ฅผ ์ฌํ์ฉํ ์ ์๋๋ก ํ์ฉ
- ๋ง์ผ ํ์ ํด๋์ค์์ ์ ๊ทผ์ ๋ง์์ผ ํ๋ค๋ฉด private ์ ํธ๋ฆฌ๋ทฐํธ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋ณด๋ค protected ์ ํธ๋ฆฌ๋ทฐํธ๋ฅผ ์ฌ์ฉํ๊ณ ์ ์ ํ ๋ฌธ์ํ๋ฅผ ํ ๊ฒ
- private ์ ํธ๋ฆฌ๋ทฐํธ๋ฅผ ๊ผญ ์ฌ์ฉํ์ผ ํ๋ ๊ฒฝ์ฐ๋ ํ์ ํด๋์ค์์ ์ด๋ฆ ์ถฉ๋์ด ์ผ์ด๋๋ ๊ฒฝ์ฐ๋ฅผ ๋ง๊ณ ์ถ์ ๋ ์ด๋ค