Files
ZiPingEightChar/vendor/tyme4py/culture/fetus/__init__.py
T
moxiaonian d9da4301cd 公众授权版:normal · 1000 次 · 有效期至 2026-12-31
副本编号 LY-20261007-AC63(水印指纹已嵌入)
含 README、.gitignore;排除 .DS_Store / __pycache__ / .pytest_cache
2026-10-07 17:29:52 +08:00

150 lines
4.5 KiB
Python

# -*- coding:utf-8 -*-
from __future__ import annotations
from typing import TYPE_CHECKING, Union, List
from tyme4py import LoopTyme, AbstractCulture
from tyme4py.culture import Direction
from tyme4py.enums import Side
if TYPE_CHECKING:
from tyme4py.lunar import LunarDay, LunarMonth
from tyme4py.sixtycycle import SixtyCycle, SixtyCycleDay
class FetusEarthBranch(LoopTyme):
"""地支六甲胎神"""
NAMES: List[str] = ['碓', '厕', '炉', '门', '栖', '床']
"""名称"""
def __init__(self, index_or_name: Union[int, str]):
super().__init__(self.NAMES, index_or_name)
@classmethod
def from_name(cls, name: str) -> FetusEarthBranch:
return cls(name)
@classmethod
def from_index(cls, index: int) -> FetusEarthBranch:
return cls(index)
def next(self, n: int):
return FetusEarthBranch(self.next_index(n))
class FetusHeavenStem(LoopTyme):
"""天干六甲胎神"""
NAMES: List[str] = ['门', '碓磨', '厨灶', '仓库', '房床']
"""名称"""
def __init__(self, index_or_name: Union[int, str]):
super().__init__(self.NAMES, index_or_name)
@classmethod
def from_name(cls, name: str) -> FetusHeavenStem:
return cls(name)
@classmethod
def from_index(cls, index: int) -> FetusHeavenStem:
return cls(index)
def next(self, n: int) -> FetusHeavenStem:
return FetusHeavenStem(self.next_index(n))
class FetusMonth(LoopTyme):
"""逐月胎神"""
NAMES: List[str] = ['占房床', '占户窗', '占门堂', '占厨灶', '占房床', '占床仓', '占碓磨', '占厕户', '占门房', '占房床', '占灶炉', '占房床']
"""名称"""
def __init__(self, index_or_name: Union[int, str]):
super().__init__(self.NAMES, index_or_name)
@classmethod
def from_name(cls, name: str) -> FetusMonth:
return cls(name)
@classmethod
def from_index(cls, index: int) -> FetusMonth:
return cls(index)
@classmethod
def from_lunar_month(cls, lunar_month: LunarMonth) -> Union[FetusMonth, None]:
"""
从农历月初始化
:param lunar_month: 农历月
:return: 逐月胎神
"""
return None if lunar_month.is_leap() else cls(lunar_month.get_month() - 1)
def next(self, n: int) -> FetusMonth:
return FetusMonth(self.next_index(n))
class FetusDay(AbstractCulture):
"""逐日胎神"""
def __init__(self, sixty_cycle: SixtyCycle):
self._fetus_heaven_stem = FetusHeavenStem(sixty_cycle.get_heaven_stem().get_index() % 5)
self._fetus_earth_branch = FetusEarthBranch(sixty_cycle.get_earth_branch().get_index() % 6)
index: int = [3, 3, 8, 8, 8, 8, 8, 1, 1, 1, 1, 1, 1, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, -9, -9, -9, -9, -9, -5, -5, -1, -1, -1, -3, -7, -7, -7, -7, -5, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 3, 3, 3, 3][sixty_cycle.get_index()]
self._side = Side.IN if index < 0 else Side.OUT
self._direction = Direction(index)
@classmethod
def from_lunar_day(cls, lunar_day: LunarDay) -> FetusDay:
return cls(lunar_day.get_sixty_cycle())
@classmethod
def from_sixty_cycle_day(cls, sixty_cycle_day: SixtyCycleDay) -> FetusDay:
return cls(sixty_cycle_day.get_sixty_cycle())
def get_name(self) -> str:
s: str = self._fetus_heaven_stem.get_name() + self._fetus_earth_branch.get_name()
if '门门' == s:
s = '占大门'
elif '碓磨碓' == s:
s = '占碓磨'
elif '房床床' == s:
s = '占房床'
elif s.startswith('门'):
s = '占' + s
s += ' '
if Side.IN == self._side:
s += '房内'
else:
s += '外'
direction_name: str = self._direction.get_name()
if Side.OUT == self._side and '北南西东'.find(direction_name) != -1:
s += '正'
s += direction_name
return s
def get_side(self) -> Side:
"""
内外
:return: 内外
"""
return self._side
def get_direction(self) -> Direction:
"""
方位
:return: 方位
"""
return self._direction
def get_fetus_heaven_stem(self) -> FetusHeavenStem:
"""
天干六甲胎神
:return: 天干六甲胎神
"""
return self._fetus_heaven_stem
def get_fetus_earth_branch(self) -> FetusEarthBranch:
"""
地支六甲胎神
:return: 地支六甲胎神
"""
return self._fetus_earth_branch