Skip to content

Commit 7baccf7

Browse files
committed
use inheritance for generated classes instead of define and update tpk
1 parent e63618e commit 7baccf7

File tree

5 files changed

+541
-1398
lines changed

5 files changed

+541
-1398
lines changed

UnityPy/classes/Object.py

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,55 @@
11
from __future__ import annotations
2+
23
from abc import ABC, ABCMeta
3-
from typing import TYPE_CHECKING, Dict, Any, Optional
4+
from typing import TYPE_CHECKING, Any, Optional
45

56
if TYPE_CHECKING:
67
from ..files.ObjectReader import ObjectReader
78
from ..files.SerializedFile import SerializedFile
89

910

10-
class Object(ABC, metaclass=ABCMeta):
11-
object_reader: Optional[ObjectReader] = None
11+
class SubObject(ABC, metaclass=ABCMeta):
12+
def __init__(self, **kwargs):
13+
required_keys = getattr(self.__class__, "__required_keys__", None)
14+
if required_keys is None:
15+
required_keys = tuple(
16+
key
17+
for key, value in self.__annotations__.items()
18+
if not value.startswith("Optional[")
19+
)
20+
self.__class__.__required_keys__ = required_keys
21+
if not all(key in kwargs for key in required_keys):
22+
raise ValueError("Missing required keys")
23+
self.__dict__.update(kwargs)
24+
25+
def __repr__(self) -> str:
26+
def format_value(v):
27+
vstr = repr(v)
28+
if len(vstr) > 100:
29+
return vstr[:97] + "..."
30+
return vstr
31+
32+
inner_str = ", ".join(
33+
f"{k}={format_value(v)}" for k, v in self.__dict__.items()
34+
)
35+
36+
return f"{self.__class__.__name__}({inner_str})"
1237

13-
def __init__(self, **kwargs: Dict[str, Any]) -> None:
14-
self.__dict__.update(**kwargs)
38+
def __eq__(self, other: object) -> bool:
39+
if not isinstance(other, self.__class__):
40+
return False
41+
return self.__dict__ == other.__dict__
42+
43+
def __hash__(self) -> int:
44+
return hash(tuple(self.__dict__.items()))
45+
46+
47+
class Object(SubObject, ABC):
48+
object_reader: Optional[ObjectReader] = None
1549

1650
def set_object_reader(self, object_info: ObjectReader[Any]):
1751
self.object_reader = object_info
1852

19-
def __repr__(self) -> str:
20-
return f"<{self.__class__.__name__}>"
21-
2253
@property
2354
def assets_file(self) -> Optional[SerializedFile]:
2455
if self.object_reader:

UnityPy/classes/UnknownObject.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,4 @@ def format_value(v):
2929
if k != "__node__"
3030
)
3131

32-
return f"<UnknownObject<{self.get_type()}> {inner_str}>"
32+
return f"UnknownObject<{self.get_type()}({inner_str})"

0 commit comments

Comments
 (0)