μ΄μ κ°μμμ λ°°μ΄ λ΄μ©μ μ€μ΅ μμ£Όλ‘ μ 리ν΄λ³΄μ
β’ λ©ν ν΄λμ€λ₯Ό μμνλ€λ κ²μ type ν΄λμ€λ₯Ό μμνλ€λ κ²μ΄λ€.
β’ type ν΄λμ€λ₯Ό μμ λ°κ³ , κ°μ²΄κ° μΈμ€ν΄μ€ν λ λ νμ μ λ΄λΆμ μΌλ‘ νΈμΆλλ ν¨μκ° μλ€.
μ΄ ν¨μλ₯Ό μ΄μ©ν΄μ ꡬ쑰μ μΌλ‘ μ΄κΈ°ν λλ μμ μ μ°λ¦¬κ° μνλ μ½λλ₯Ό μμ±ν μ μλ€.
β’ μ΄λ₯Ό μ΄μ©ν΄μ 컀μ€ν λ©ν ν΄λμ€λ₯Ό μμ±ν μ μλ€.
- ν΄λμ€ μμ±μ κ°λ‘μ±κΈ° (
__new__
λ__init__
λ± )- ν΄λμ€ μμ νκΈ° ( modify)
- ν΄λμ€ κ°μ νκΈ° (κΈ°λ₯ μΆκ°)
- μμ λ ν΄λμ€ λ°ννκΈ°
ν΄λμ€ λ°κΉ₯μ μ μλ λ©μλλ₯Ό κ°μ Έλ€ μ°λ 컀μ€ν
λ©ν ν΄λμ€λ₯Ό λ§λλ €κ³ νλ€.
κ·Έλ°λ° μ΄λ λ©μλλ selfλ₯Ό μ΄μ©νκ² λ§λ€μλ€.
selfλ μΈμ€ν΄μ€ μμ μ μλ―Ένλ―λ‘, μ¦ selfλ μνμ€ν λ°μ΄ν°κ° λ κ²μ΄λ€.
def cus_mul(self, d):
for i in range(len(self)):
self[i] = self[i] * d
def cus_replace(self, old, new):
while old in self:
self[self.index(old)] = new
type ν¨μλ₯Ό μ΄μ©ν΄μ λ°°μ΄ μλ£ν ; list
λ₯Ό μμλ°λ λ©ν ν΄λμ€λ₯Ό λ§λ€μ΄λ³΄μ.
CustomList1 = type(
'CustomList1',
(list,),
{
'desc': '컀μ€ν
리μ€νΈ1',
'cus_mul': cus_mul,
'cus_replace': cus_replace,
}
)
c1 = CustomList1([1, 2, 4, 5, 3, 3])
컀μ€ν
λ©ν ν΄λμ€ CustomList1
λ list
λ₯Ό μμ λ°μκΈ° λλ¬Έμ,
μ΄λ₯Ό μΈμ€ν΄μ€ν ν λ λ°°μ΄μ μΈμλ‘ λ£μ΄μ€μΌλ‘μ self
λ μ°λ¦¬κ° μ
λ ₯ν λ°°μ΄μ΄ λμλ€.
c1.cus_mul(1000)
print('ex 1>', c1)
# ex 1> [1000,2000,4000,5000,3000,3000]
# 3000μ hahaλ‘ λ°κΎΈκ² λ€.
c1.cus_replace(3000, 'haha')
print('ex 1>', c1)
# ex 1> [1000,2000,4000,5000,'haha','haha']
print('ex 1>', c1.desc)
# ex 1> 컀μ€ν
리μ€νΈ1
print('ex 1>', dir(c1))
# μ°λ¦¬κ° μΆκ°ν λ©μλμ
# 리μ€νΈμμ μ¬μ©ν μ μλ λ΄μ₯ν¨μλ€μ΄ ν¬ν¨λμ΄ μλ€.
# ['append', 'sort', ..., 'cus_mul', 'cus_replace', 'desc' ]
type ν¨μλ₯Ό μμ λ°μ μ§μ 컀μ€ν
λ©νν΄λμ€λ₯Ό λ§λ¦μΌλ‘μ,
μμ 1λ²μμ 보μ΄μ§ μμλ λ΄λΆ μ²λ¦¬ κ³Όμ μ λ³Ό μ μλ€.
3κ°μ§ ν¨μλ₯Ό μ΄μ©ν΄μ μ‘°κΈ λ λν μΌνκ² μ»€μ€ν°λ§μ΄μ¦ ν μ μκ² λλ€.
__new__
ν΄λμ€ μΈμ€ν΄μ€λ₯Ό μμ±νλ€. (λ©λͺ¨λ¦¬ μ΄κΈ°ν)
ν΄λμ€ μμ± μμ μ μΈμ 4κ°κ° λμ΄μ€κ² λ§λ λ€.
- metaclass : λ©νν΄λμ€μ μ΄λ¦
- name, bases, namespace : type ν¨μμ κ°λ€.
__init__
__new__
μμ μμ±λ μΈμ€ν΄μ€λ₯Ό μ΄κΈ°ννλ€.
μΈμ 4κ°κ° λμ΄μ¨λ€.
- self : μΈμ€ν΄μ€μ μ΄λ¦
- name, bases, namespace : type ν¨μμ κ°λ€.
__call__
μΈμ€ν΄μ€λ₯Ό μ€ννλ€.
μΈμ 3κ°κ° λμ΄μ¨λ€.
- self : μΈμ€ν΄μ€μ μ΄λ¦
- *args : μ λ ₯ λ°μ μ¬λ¬κ°μ μΈμλ₯Ό μ κ·Όν μ μλ€.
- **kwargs : key=value ννλ‘ μ λ ₯ λ°μ μΈμλ₯Ό λμ λ리 ννλ‘ μ κ·Όκ°λ₯νλ€.
def cus_mul(self, d):
for i in range(len(self)):
self[i] = self[i] * d
def cus_replace(self, old, new):
while old in self:
self[self.index(old)] = new
# typeμ μμλ°μ λ©ν ν΄λμ€ CustomListMeta
class CustomListMeta(type):
def __init__(self, object_or_name, bases, dict):
print('ex2 > __init__ ->', self, object_or_name, bases, dict)
super().__init__(object_or_name, bases, dict)
def __call__(self, *args, **kwargs):
print('ex2 > __call__ ->', self, *args, **kwargs)
return super().__call__(*args, **kwargs)
def __new__(metacls, name, bases, namespace):
print('ex2 > __new__ ->', metacls, name, bases, namespace)
namespace['desc'] = '컀μ€ν
리μ€νΈ 2'
namespace['cus_mul'] = cus_mul # μ¬μ¬μ©
namespace['cus_replace'] = cus_replace
return type.__new__(metacls, name, bases, namespace)
CustomList2 = CustomListMeta(
'CustomList2',
(list,),
{}
)
μμ 1λ²κ³Ό λμΌνκ² λμνλ€.
c2 = CustomList2([1, 2, 3, 4, 5, 6, 7, 8])
c2.cus_mul(1000)
c2.cus_replace(1000, 7777)
print('ex 2>', c2)
print('ex 2>', c2.desc)
# μμ νμΈ
print(CustomList2.__mro__)
# μΌμͺ½μ΄ μ€λ₯Έμͺ½μ μμλ°μ κ²
#(<class '__main__.CustomList2'>, <class 'list'>, <class 'object'>)
μ 리
- ν΄λμ€ λ°κΉ₯μ μ μλ selfλ₯Ό μ°λ λ©μλλ μ»΄ν¬λνΈν λμ΄,
λ©ν ν΄λμ€ λ΄λΆμ λ©μλμμ μ¬μ©λ μ μλ€.- type μ μμ λ°κ³ , λ΄λΆ ν¨μμΈ
__new__
,__init__
,__call__
μ μ΄μ©ν΄μ λ©νν΄λμ€λ₯Ό μ‘°κΈ λ 체κ³μ μΌλ‘ 컀μ€ν°λ§μ΄μ¦ ν μ μλ€.
[μΆμ²]