-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbetter_way_48_1.py
More file actions
32 lines (25 loc) · 1.18 KB
/
better_way_48_1.py
File metadata and controls
32 lines (25 loc) · 1.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
""" 메타클래스는 type을 상속해 정의된다.
메타클래스는 클래스 이름, 클래스의 부모 클래스들, 모든 클래스 애트리뷰트에 접근할 수 있다.
"""
class ValidatePolygon(type):
def __new__(meta, name, bases, class_dict):
if bases: # 하위 클래스만 검증한다. 하위 클래스가 아닌 경우 bases 변수에는 빈 튜플이 들어 있다.
if class_dict['sides'] < 3:
# `class_dict` 에는 클래스 애트리뷰트가 저장되어 있다.
# 이 메서드는 하위 클래스의 선언부가 인터프리터에게 발견되는 시점에 실행되므로
# 당연히 객체 애트리뷰트는 조회가 불가능하다.
raise ValueError('다각형의 변은 최소 3개입니다.')
return type.__new__(meta, name, bases, class_dict)
class Polygon(metaclass=ValidatePolygon):
sides = None
@classmethod
def interior_angles(cls):
return (cls.sides - 2) * 180
if __name__ == '__main__':
class Rectangle(Polygon):
sides = 4
try:
class Line(Polygon):
sides = 1
except ValueError as e:
print(e)