Skip to content

Commit d6a39ab

Browse files
committed
refactor: simplify slide master and layout class structure with new metaclasses
1 parent c5f5953 commit d6a39ab

File tree

1 file changed

+14
-57
lines changed

1 file changed

+14
-57
lines changed

design/slide_master.py

Lines changed: 14 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,76 +1,33 @@
1-
from typing import Any, ClassVar, Self, overload
1+
from typing import Annotated
22

33
from typing_extensions import dataclass_transform
44

55

6-
class TpptSlideMasterMeta(type):
7-
"""TpptSlideMasterのメタクラス"""
6+
class Placeholder:
7+
pass
88

9-
def __getattr__(self, key: str) -> "type[TpptSlideLayout]":
10-
if key in self.__annotations__:
11-
annotation = self.__annotations__[key]
12-
if issubclass(annotation, TpptSlideLayout):
13-
return annotation
14-
else:
15-
raise AttributeError(f"属性 {key}{annotation} ではありません")
169

17-
raise AttributeError(f"属性 {key} は存在しません")
10+
class TpptSlideLayoutMeta(type):
11+
"""TpptSlideLayoutのメタクラス"""
12+
13+
...
1814

1915

2016
@dataclass_transform(
2117
eq_default=True,
2218
order_default=False,
2319
field_specifiers=(),
2420
)
25-
class TpptSlideMaster(metaclass=TpptSlideMasterMeta):
26-
"""スライドマスターのベースクラス"""
27-
28-
_template_path: ClassVar[str | None] = None
29-
30-
@classmethod
31-
def get_template_path(cls) -> str | None:
32-
"""
33-
テンプレートパスを取得する
34-
"""
35-
return cls._template_path
36-
37-
38-
class TpptSlideLayout:
21+
class TpptSlideLayout(metaclass=TpptSlideLayoutMeta):
3922
"""スライドレイアウトのベースクラス"""
4023

41-
@overload
42-
def __get__(self, instance: None, objtype: type[Any]) -> type[Self]: ...
43-
44-
@overload
45-
def __get__(self, instance: object, objtype: type[Any]) -> Self: ...
46-
47-
def __get__(self, instance: object | None, objtype: type[Any]) -> type[Self] | Self:
48-
if instance is None:
49-
return type(self)
50-
51-
else:
52-
return self
53-
54-
55-
class MyMasterSlide(TpptSlideLayout):
56-
def __init__(self, a: int, b: str): ...
57-
58-
59-
class MyTitleSlide(TpptSlideLayout): ...
60-
61-
62-
class MyContentSlide(TpptSlideLayout): ...
24+
...
6325

6426

65-
class MySlideMaster(TpptSlideMaster):
66-
master: MyMasterSlide
67-
title: MyTitleSlide
68-
totle_and_content: MyContentSlide
27+
class MySlideLayout(TpptSlideLayout):
28+
title: Annotated[str, Placeholder]
29+
text: Annotated[str, Placeholder]
6930

7031

71-
# 以下のアサーションが通るようにせよ
72-
master: type[TpptSlideMaster] = MySlideMaster
73-
assert MySlideMaster.master == MyMasterSlide
74-
assert MySlideMaster.title == MyTitleSlide
75-
assert MySlideMaster.totle_and_content == MyContentSlide
76-
MySlideMaster.master(a=1, b="a")
32+
myslide: type[TpptSlideLayout] = MySlideLayout
33+
myslide(title="a", text="b")

0 commit comments

Comments
 (0)