117 lines
3.5 KiB
Python
117 lines
3.5 KiB
Python
from dataclasses import dataclass
|
|
from typing import List
|
|
import random
|
|
|
|
@dataclass
|
|
class Identity:
|
|
"""身份特征类"""
|
|
identity_detail: List[str] # 身份细节描述
|
|
height: int # 身高(厘米)
|
|
weight: int # 体重(千克)
|
|
age: int # 年龄
|
|
gender: str # 性别
|
|
appearance: str # 外貌特征
|
|
|
|
_instance = None
|
|
|
|
def __new__(cls, *args, **kwargs):
|
|
if cls._instance is None:
|
|
cls._instance = super().__new__(cls)
|
|
return cls._instance
|
|
|
|
def __init__(self, identity_detail: List[str] = None, height: int = 0, weight: int = 0,
|
|
age: int = 0, gender: str = "", appearance: str = ""):
|
|
"""初始化身份特征
|
|
|
|
Args:
|
|
identity_detail: 身份细节描述列表
|
|
height: 身高(厘米)
|
|
weight: 体重(千克)
|
|
age: 年龄
|
|
gender: 性别
|
|
appearance: 外貌特征
|
|
"""
|
|
if identity_detail is None:
|
|
identity_detail = []
|
|
self.identity_detail = identity_detail
|
|
self.height = height
|
|
self.weight = weight
|
|
self.age = age
|
|
self.gender = gender
|
|
self.appearance = appearance
|
|
|
|
@classmethod
|
|
def get_instance(cls) -> 'Identity':
|
|
"""获取Identity单例实例
|
|
|
|
Returns:
|
|
Identity: 单例实例
|
|
"""
|
|
if cls._instance is None:
|
|
cls._instance = cls()
|
|
return cls._instance
|
|
|
|
@classmethod
|
|
def initialize(cls, identity_detail: List[str], height: int, weight: int,
|
|
age: int, gender: str, appearance: str) -> 'Identity':
|
|
"""初始化身份特征
|
|
|
|
Args:
|
|
identity_detail: 身份细节描述列表
|
|
height: 身高(厘米)
|
|
weight: 体重(千克)
|
|
age: 年龄
|
|
gender: 性别
|
|
appearance: 外貌特征
|
|
|
|
Returns:
|
|
Identity: 初始化后的身份特征实例
|
|
"""
|
|
instance = cls.get_instance()
|
|
instance.identity_detail = identity_detail
|
|
instance.height = height
|
|
instance.weight = weight
|
|
instance.age = age
|
|
instance.gender = gender
|
|
instance.appearance = appearance
|
|
return instance
|
|
|
|
def get_prompt(self,x_person,level):
|
|
"""
|
|
获取身份特征的prompt
|
|
"""
|
|
if x_person == 2:
|
|
prompt_identity = "你"
|
|
elif x_person == 1:
|
|
prompt_identity = "我"
|
|
else:
|
|
prompt_identity = "他"
|
|
|
|
if level == 1:
|
|
identity_detail = self.identity_detail
|
|
random.shuffle(identity_detail)
|
|
prompt_identity += identity_detail[0]
|
|
elif level == 2:
|
|
for detail in identity_detail:
|
|
prompt_identity += f",{detail}"
|
|
prompt_identity += "。"
|
|
return prompt_identity
|
|
|
|
def to_dict(self) -> dict:
|
|
"""将身份特征转换为字典格式"""
|
|
return {
|
|
"identity_detail": self.identity_detail,
|
|
"height": self.height,
|
|
"weight": self.weight,
|
|
"age": self.age,
|
|
"gender": self.gender,
|
|
"appearance": self.appearance
|
|
}
|
|
|
|
@classmethod
|
|
def from_dict(cls, data: dict) -> 'Identity':
|
|
"""从字典创建身份特征实例"""
|
|
instance = cls.get_instance()
|
|
for key, value in data.items():
|
|
setattr(instance, key, value)
|
|
return instance |