# 三方四正 (/zh/docs/python/surpalaces)

SurroundedPalaces 的四个宫位与五个判断方法。



三方四正是斗数最常用的取象范围。看一件事不能只看本宫，
对宫与两个三合宫的星耀同样作用其上，四宫合看才完整。

<Callout type="info">
  本页示例统一用默认的 `zh-CN` 排盘，因此输出里的展示值都是中文。
</Callout>

## 四个宫位 [#四个宫位]

| 字段         | 相对本宫 | 传统称呼 | 意义             |
| ---------- | ---- | ---- | -------------- |
| `target`   | +0   | 本宫   | 事情本身           |
| `opposite` | +6   | 对宫   | 与本宫相对的一面，影响最直接 |
| `career`   | +4   | 官禄位  | 三合之一           |
| `wealth`   | +8   | 财帛位  | 三合之一           |

四个字段都是 `Palace`，[宫位对象](/zh/docs/python/palace)的全部方法都能用。

<Callout type="info" title="财帛位、官禄位是相对称呼">
  `wealth` 与 `career` 指的是「相对本宫的三合位置」，不是十二宫里那两个固定的宫名。
  以命宫起算时它们恰好落在财帛宫与官禄宫（+8 与 +4），名字就是这么对上的；
  以别的宫起算则是别的宫。
</Callout>

## 三种取法 [#三种取法]

```python
# 从星盘取
sp = chart.surrounded_palaces("soulPalace")

# 从宫位取
sp = chart.palace("soulPalace").surrounded_palaces()

# 从星耀取（该星所在宫的三方四正）
sp = chart.star("ziweiMaj").surrounded_palaces()
```

三者结果相同，选哪个取决于手上已有什么。

***

## have / not\_have / have\_one\_of [#have--not_have--have_one_of]

**用途**　判断四宫合起来有没有指定星耀。

**斗数含义**　「三方四正见紫微」这类说法，问的正是这四宫里出没出现某颗星，
而不问具体落在其中哪一宫。

**签名**

```python
def have(self, stars: list[str]) -> bool
def not_have(self, stars: list[str]) -> bool
def have_one_of(self, stars: list[str]) -> bool
```

**参数**

| 参数      | 类型          | 必填 | 默认 | 说明                       |
| ------- | ----------- | -- | -- | ------------------------ |
| `stars` | `list[str]` | 是  | —  | 星耀标识列表；也接受**当前排盘语言**下的星名 |

**返回值**

| 方法            | 语义                   |
| ------------- | -------------------- |
| `have`        | 列表中每一颗都出现在这四宫（不要求同宫） |
| `not_have`    | 列表中一颗都没出现            |
| `have_one_of` | 列表中至少一颗出现            |

**示例**

```python
from x_iztro import MajorStar, MinorStar

sp = chart.surrounded_palaces("soulPalace")

print(sp.have([MajorStar.ZIWEI, MajorStar.TIANXIANG]))
print(sp.have_one_of([MajorStar.QISHA, MajorStar.POJUN]))
print(sp.not_have([MinorStar.HUOXING]))
```

**输出**

```text
True
False
True
```

紫微在命宫、天相在财帛宫，分处两宫但都在这四宫内，因此 `have` 为真。

**边界与陷阱**

<Accordions>
  <Accordion title="have 不要求同宫">
    `have([A, B])` 的语义是「A 和 B 都出现在这四宫里」，
    不要求它们坐在同一宫。要判断同宫，用宫位的 [`has`](/zh/docs/python/palace#has--not_have--has_one_of)。
  </Accordion>

  <Accordion title="空列表的返回值">
    `have` 与 `not_have` 在空列表下返回 `True`，`have_one_of` 返回 `False`。
  </Accordion>
</Accordions>

***

## have\_mutagen / not\_have\_mutagen [#have_mutagen--not_have_mutagen]

**用途**　判断四宫里有没有某种生年四化。

**斗数含义**　「三方四正见忌」意味着这组宫位里坐着一颗被生年干化忌的星，
是判断压力来源的常用条件。

**签名**

```python
def have_mutagen(self, mutagen: Mutagen) -> bool
def not_have_mutagen(self, mutagen: Mutagen) -> bool
```

**参数**

| 参数        | 类型    | 必填 | 默认 | 说明     |
| --------- | ----- | -- | -- | ------ |
| `mutagen` | `str` | 是  | —  | 四化标识之一 |

**返回值**　`bool`。

**示例**

```python
from x_iztro import Mutagen

sp = chart.surrounded_palaces("soulPalace")

print("三方四正见禄:", sp.have_mutagen(Mutagen.LU))
print("三方四正见忌:", sp.have_mutagen(Mutagen.JI))
print("三方四正不见科:", sp.not_have_mutagen(Mutagen.KE))
```

**输出**

```text
三方四正见禄: False
三方四正见忌: False
三方四正不见科: True
```

这张盘的生年四化落在四宫：太阳化禄在子女、武曲化权在财帛、太阴化科在仆役、天同化忌在疾厄。
命宫的三方四正是命宫、迁移、财帛、官禄——只有化权那一颗落在里面，
因此查禄、查忌都是 `False`，查权则会是 `True`。

**边界与陷阱**

<Callout type="info">
  这里看的是**生年四化**打在星上的标记，与宫干飞出的四化无关。
  后者请用宫位的飞星族方法。
</Callout>

***

## to\_text [#to_text]

**用途**　三方四正的语义化文本：本宫、对宫、财帛位、官禄位各一段。

**签名**

```python
def to_text(
    self,
    *,
    knowledge: bool | KnowledgePack | None = None,
    config: PatternConfig | None = None,
) -> str
```

**参数**

| 参数          | 类型                              | 必填 | 默认     | 说明                                                                                                                 |
| ----------- | ------------------------------- | -- | ------ | ------------------------------------------------------------------------------------------------------------------ |
| `knowledge` | `bool \| KnowledgePack \| None` | 否  | `None` | 释义材料：`True` 取排盘语言的内嵌默认包，`KnowledgePack` 用该包；给出时四宫各自的事实行之后紧跟该宫星耀的释义，见[带释义的文本](/zh/docs/guide/guides/to-text#带释义的文本) |
| `config`    | `PatternConfig \| None`         | 否  | `None` | 格局判定口径，与 `patterns(config)` 同一入参；同时作用于文本的格局节与格局释义。`None` 取默认口径                                                     |

**返回值**　`str`——`## 命宫 三方四正` 标题之下四宫各一段 `### `，标题带角色前缀（本宫、对宫、财帛位、官禄位），
事实行与单宫 `to_text` 一致。

**示例**

```python
sp = chart.surrounded_palaces("命宫")

print("\n".join(l for l in sp.to_text().splitlines() if l.startswith("#")))
print(len(sp.to_text()), len(sp.to_text(knowledge=True)))
```

**输出**

```text
## 命宫 三方四正
### 本宫 · 命宫 (壬午) · 大限 3-12
### 对宫 · 迁移 (戊子) · 大限 63-72
### 财帛位 · 财帛 (戊寅) · 大限 43-52
### 官禄位 · 官禄 (丙戌) · 大限 83-92 [身宫]
924 6312
```

本宫脱离星盘单独构造时没有排盘上下文，调用抛 `ValueError`；
`knowledge=True` 而排盘语言没有内嵌包（目前只有 zh-CN 有）抛 `IztroError`。
完整格式见[语义化文本](/zh/docs/guide/guides/to-text)。
