1.2 객체의 특징
- object 클래스로 객체의 레퍼런스 확인하기 (인스턴스 객체를 만들어서 사용)
False
False
133982244159440 133982244159424
t와 ts는 같은 변수인것을 알 수 있다.
True
True
133982029611968 133982029611968
- int 클래스에 대한 책임성 확인하기
- 대부분의 종속성은 앞에 것이 주최가 되서 나머지가 종속된다.
15
15
5
5
- int 클래스 내에서 관리하는 속성과 메소드 확인하기
- enumerate는 데이터 전송시 인덱스를 같이 붙여서 보내주는것
__abs__ __add__ __and__ __bool__ __ceil__
__class__ __delattr__ __dir__ __divmod__ __doc__
__eq__ __float__ __floor__ __floordiv__ __format__
__ge__ __getattribute__ __getnewargs__ __gt__ __hash__
__index__ __init__ __init_subclass__ __int__ __invert__
__le__ __lshift__ __lt__ __mod__ __mul__
__ne__ __neg__ __new__ __or__ __pos__
__pow__ __radd__ __rand__ __rdivmod__ __reduce__
__reduce_ex__ __repr__ __rfloordiv__ __rlshift__ __rmod__
__rmul__ __ror__ __round__ __rpow__ __rrshift__
__rshift__ __rsub__ __rtruediv__ __rxor__ __setattr__
__sizeof__ __str__ __sub__ __subclasshook__ __truediv__
__trunc__ __xor__ as_integer_ratio bit_count bit_length
conjugate denominator from_bytes imag numerator
real to_bytes
1.3 최상위 클래스 object 이해하기
- object 클래스 내부의 속성과 메소드 보기
- 기본 오브젝트 클래스는 기본이 되는 클래스들만 가지고 있다.
__class__ __delattr__ __dir__ __doc__ __eq__ __format__
__ge__ __getattribute__ __gt__ __hash__ __init__ __init_subclass__
__le__ __lt__ __ne__ __new__ __reduce__ __reduce_ex__
__repr__ __setattr__ __sizeof__ __str__ __subclasshook__
아래와 같이 사용하면 문서로 해당 내용 설명해줌
The base class of the class hierarchy.
When called, it accepts no arguments and returns a new featureless
instance that has no instance attributes and cannot be given any.
object
<class 'object'>
<type object at 0x584ba43bb800>
모든 객체의 기본적인 동등성 비교 메서드로, 이 메서드는 두 객체가 동일한 값을 가지는지 여부를 확인
True
True
1.4 파이썬 클래스 생성 및 기본 상속 구조
- Type 클래스의 instance 여부 확인
- Type 클래스를 기반으로 인스턴스 만들어진 것들이다.
- 인스턴스는 객체 지향 프로그래밍(OOP)에서 해당 클래스의 구조로 컴퓨터 저장 공간에서 할당된 실체를 의미
True
True
True
True
True
True
True
True
True
- 서브클래스는 베이스가 오브젝트이다.
True
True
True
True
True
True
True
True
True
- Class 내부 속성 __ class __, __ bases __ 확인
<class 'type'>
<class 'type'>
<class 'type'>
<class 'type'>
<class 'type'>
<class 'type'>
<class 'type'>
<class 'type'>
<class 'type'>
(<class 'object'>,)
()
(<class 'object'>,)
(<class 'object'>,)
(<class 'object'>,)
(<class 'object'>,)
(<class 'object'>,)
(<class 'object'>,)
(<class 'object'>,)
1.4.2 클래스와 인스턴스의 관계
메타 클래스를 통해서 만들어지게 된다. (메타 데이터를 관리하는 클래스)
- 내장 클래스와 인스턴스의 관계 확인
True
True
True
True
True
True
True
True
isinstance() 함수는 지정된 객체가 지정된 유형인지 확인
만약 유형 매개변수가 튜플이라면, 해당 객체가 튜플 내의 유형 중 하나인 경우 True를 반환
<class 'object'>
<class 'int'>
<class 'float'>
<class 'str'>
<class 'tuple'>
<class 'list'>
<class 'dict'>
<class 'set'>
1.5 사용자 정의 클래스
- 사용자 정의 클래스 기본 확인
- 기존의 클래스를 베이스로 학습
<class 'type'>
(<class 'object'>,)
True
True
<class '__main__.Int'> 10
mappingproxy({'__dict__': <attribute '__dict__' of 'Int' objects>,
'__doc__': None,
'__module__': '__main__'})
<class 'type'>
(<class 'int'>,)
True
True
True
- Person 사용자 클래스를 정의 및 속성 확인
<__main__.Person object at 0x79db0214f2b0>
{'name': '줄리아', 'age': 15}
줄리아
15
오브젝트가 가지는 메소드 , Person가 가지는 메소드의 차집합으로 Person에서만 가지는 메소드만 확인
{'__module__', '__dict__', '__weakref__'}
__main__
(<class 'object'>,)
<class 'type'>
1.6 객체 네임스페이스 및 스코프
1.6.1 인스턴스와 클래스 객체 네임스페이스 및 스코프 처리 기준
자기를 생성한 네임스페이스를 볼 수 있는 권한이 있어 거꾸로 올라가면서 볼 수 있다.
- 클래스와 인스턴스 객체간의 네임스페이스 접근
instance attr
Klass attr
다른 언어에서는 안됨
{'name': 'instance attr', 'getclassname': 'Klass attr'}
Klass attr
- 사용자 데이터를 활용하기 위해서는 인스턴스객체를 만들어야한다.
instance attr
instance attr
mappingproxy({'__dict__': <attribute '__dict__' of 'Klass' objects>,
'__doc__': None,
'__init__': <function Klass.__init__ at 0x79db0211f7f0>,
'__module__': '__main__',
'__weakref__': <attribute '__weakref__' of 'Klass' objects>,
'getname': <function Klass.getname at 0x79db0211f910>,
'name': 'Klass attr'})
<bound method Klass.getname of <__main__.Klass object at 0x79db0214ce50>>
<function Klass.getname at 0x79db0211f910>
2. 생성자(Constructor)와 소멸자(Destructor)
2.1 생성자 이해하기: __ new __
- 클래스 생성자로 인스턴스 생성하기
- 우리는 __init__을 많이 사용하는데 그것은 __init__이 생성자처럼 인스턴스 초기화 작업을 자동으로 처리해주기 때문 , 별도로 특정 기능을 지정해서 사용하려면 __new__ 생성자를 이용해서 사용한다.
- __new__는 새로운 인스턴스를 생성한 후 그 인스턴스를 __init__에게 넘겨주는 역할을 한다.
- __new__: 클래스로부터 새로운 인스턴스를 생성하는 메서드. 주로 상속받는 클래스를 만들 때나 불변 객체를 만들 때 오버라이드합니다.
- __init__: 생성된 인스턴스를 초기화하는 메서드. 인스턴스 변수 설정 등의 초기화 작업을 처리합니다.
<__main__.AAA object at 0x79db0214fa00>
# __new__ 메서드는 기본 객체 생성 메서드를 호출하여 새로운 인스턴스를 생성하고, 이를 반환하여 aaa 변수에 할당
mappingproxy({'__dict__': <attribute '__dict__' of 'AAA' objects>,
'__doc__': None,
'__module__': '__main__',
'__new__': <staticmethod(<function AAA.__new__ at 0x79db0211e290>)>,
'__weakref__': <attribute '__weakref__' of 'AAA' objects>})
True
- 자기 자신의 클래스만 처리
- 생성할려고 할때 상위클래스 기능들이 동작하는 경우가 많은데, 그 틀을 막고 자기 자신만 처리하려고할때 이용
- __new__ 메서드를 사용하여 인스턴스 대신 클래스 자체를 반환함으로써, 인스턴스 생성 과정을 막고, 클래스 자체를 처리하는 방법, 이를 통해 상위 클래스의 기능들을 사용하지 않고, 특정 상황에서 자신만의 클래스를 처리하는 방법을 구현할 수 있다.
<class '__main__.OnlyKlass'>
<class 'type'>
True
- OnlyKlass 클래스의 __new__ 메서드를 사용하여 인스턴스 대신 클래스를 반환하고, 클래스 메서드를 통해 클래스 속성을 설정하고 가져오는 방법
- OnlyKlass 클래스의 구조와 메서드가 클래스 딕셔너리 내에 어떻게 저장되는지 확인
- getname과 setname 클래스 메서드가 정의되어 있는 것을 확인함
mappingproxy({'__dict__': <attribute '__dict__' of 'OnlyKlass' objects>,
'__doc__': None,
'__module__': '__main__',
'__new__': <staticmethod object at 0x0000000004B50588>,
'__weakref__': <attribute '__weakref__' of 'OnlyKlass' objects>,
'getname': <classmethod object at 0x0000000004B509B0>,
'setname': <classmethod object at 0x0000000004B509E8>})
class method
2.2 초기화 메서드 사용하기: __ init __
- 인스턴스 속성을 초기화
{'name': '금곡초', 'age': 10}
TypeError: __init__() missing 2 required positional arguments: 'name' and 'age'
{'name': '금곡중', 'age': 15, 'count': 1}
금곡중
15
1
2.3 소멸자 메서드 사용하기: __ del __
- 소멸자 정의된 클래스 생성하기
각 인스턴스는 초기화될 때마다 Counter.count가 증가하며, 삭제될 때마다 감소
<__main__.Counter object at 0x79db0214d480>
{'name': ' First '}
1
<__main__.Counter object at 0x79db0214c5e0>
{'name': ' Second '}
2
del가 한번 호출될때마다 -1 시켜줌으로 2-1 인 1이 나와야한다.
1
- 약한 참조 이용하기
1575533008
1575533008
1
약한 참조를 사용하여 객체를 참조하고, 객체가 존재할 경우 해당 객체의 메서드를 호출하는 방법
- assert 문은 조건을 검사하고, 조건이 거짓일 경우 프로그램이 예외를 발생시키는 Python의 내장 명령문
<class 'weakref.ReferenceType'> <weakref at 0x79db1f4c4b80; to 'MyObject' at 0x79db0214dbd0> my_method was called!
<weakref at 0x79db1f4c4b80; to 'MyObject' at 0x79db0214dbd0>
<__main__.MyObject object at 0x79db0214dbd0>
2.4 생성자 작동 원리 이해하기
- 생성자, 초기화, 호출연산자를 정의한 클래스
__new__
__init__
<__main__.MDPerson object at 0x79db0214f4f0>
춘식이
quant
type 이용
<__main__.MDPerson object at 0x79db0214de40>
춘장이
quant
<__main__.MDPerson object at 0x79db0214d5d0>
춘장삼
quant
2.5 함수를 이용한 생성자 패턴
- 함수의 결과로 인스턴스 생성하기
<__main__.Employee object at 0x79db0214d090>
<class '__main__.Employee'>
depart가 None이 들어간 경우
<__main__.Employer object at 0x79db0214fd60>
<class '__main__.Employer'>
2.6 인스턴스 네임스페이스 변경하기: __ slots __
- __ slots __ 사용하기
- __ slots __ : 파이썬 클래스에서 인스턴스 속성을 제한하는 메커니즘
- 일반적으로 파이썬 클래스는 인스턴스의 속성을 동적으로 추가할 수 있지만, __slots__를 사용하면 특정 클래스의 인스턴스가 가질 수 있는 속성을 제한할 수 있다. (네임 스페이스 내용 관리에 용이)
AttributeError: 'Klass' object has no attribute 'age' # 슬롯에 지정이 않되어 있어서 age에 의해 에러남
이처럼 슬롯을 이용해서 네임스페이스 안에 내용을 제한할 수 있음
<__main__.Klass object at 0x79db0214d210>
<__main__.Klass object at 0x79db0214c670>
name
AttributeError: 'Klass' object has no attribute '__dict__'
['__class__',
'__dir__',
'__doc__',
'__eq__',
'__format__',
'__ge__',
'__getattribute__',
'__gt__',
'__hash__',
'__init__',
'__init_subclass__',
'__le__',
'__lt__',
'__module__',
'__ne__',
'__new__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__setattr__',
'__sizeof__',
'__slots__',
'__str__',
'__subclasshook__',
'name']
여기있는 클래스에서 반듯이 필요한 것들은 다 들어있음, __dict__는 빠져있는 것을 볼 수 있다. (dict는 클래스에서 반듯이 필요한 부분은 아니다.) - 슬롯이 딕트를 대체했다(네임스페이스를 관리해주던것이 딕트였으니까)
- __slots__를 사용하면 메모리 사용량이 줄어들고 객체 접근 속도가 약간 향상될 수 있습니다. 그 이유는 객체의 속성을 딕셔너리 대신 튜플 형태로 관리하기 때문입니다.
- 하지만 __slots__를 사용하면 동적으로 속성을 추가할 수 없으며, 인스턴스에 정의된 속성만을 사용할 수 있습니다.
- 따라서 __dict__가 없는 경우에는 해당 클래스의 인스턴스는 __slots__에 명시된 속성만을 가지고 있음을 의미합니다.
- __slots__를 사용하면 객체의 메모리 효율성을 높이고 속성 접근 속도를 개선할 수 있지만, 동적 속성 추가 기능이 필요한 경우에는 __dict__를 사용하는 일반적인 클래스 정의 방식을 사용해야 합니다.
('name',)
<member 'name' of 'Klass' objects>
<class 'member_descriptor'>
- 관행적으로 __ dict __ 속성 조회 로직이 있을 경우
5 5
{}
3. 객체 접근 연산(.)
3.1 점(dot) 연산
- 초기화 처리할 때 속성을 접근
__setattr__ name
사람
__setattr__ age
50
3.2 점 연산자 스페셜 메서드(Special Method) 기본 이해하기
- __ getattribute __를 이용해서 클래스 내부 검색
attribute name name
긍정
즐기기
attribute name __getattr__
attr name job
즐기기
- attrgetter를 이용해서 속성 접근
- operator.attrgetter 함수는 주어진 객체에서 속성을 가져오는 함수를 생성
operator.attrgetter('name', 'age', 'job')
('가을이', 10, '즐기기')
'PYTHON-BACK' 카테고리의 다른 글
#파이썬 기초 9일차_1 (0) | 2024.07.09 |
---|---|
#파이썬 기초 8일차_2 (0) | 2024.07.08 |
#파이썬 기초 7일차_2 (1) | 2024.07.05 |
#파이썬 기초 7일차_1 (1) | 2024.07.05 |
#파이썬 기초 6일차_1 (0) | 2024.07.04 |