<h2>总之</h2>
<p>因为您寻找的是UML符号,而不是Python方面:</p>
<p><a href="https://i.stack.imgur.com/VHyNK.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/VHyNK.png" alt="CLass diagram with game and players and an association with a constraint"/></a></p>
<h2>更多解释</h2>
<h2>不可改变</h2>
<p>UML的只读属性用<code>{readOnly}</code>注释。规范定义了语义:</p>
<blockquote>
<p>If a StructuralFeature is marked with isReadOnly true, then <strong>it may not be updated once it has been assigned an initial value</strong>. Conversely, when isReadOnly is false (the default), the value may be modified.</p>
</blockquote>
<p>然而,UML并没有说明初始值是如何提供的。如果它是私有属性,您可能会向构造函数提供初始名称。显示它(用前面的<code>«create»</code>)将澄清歧义</p>
<h2>独特的</h2>
<p>同样,也可以为属性指示<code>{unique}</code>。但是,这仅适用于多值属性,因为这意味着<strong>同一对象的多值属性值之间不存在重复值。您可能会有一些带有单个<code>Name</code>的<code>Player</code>对象:然后添加<code>{unique}</code>与不添加<code>{unique}</code>没有区别</p>
<p>如果你在某处有一个<code>Game</code>与两个<code>Players</code>关联,你可以在关联端放一个<code>{unique}</code>来表示它是两个不同的玩家,但没有什么能阻止他们拥有相同的名字。幸运的是,有两种预GMATIC解决方案:</p>
<ul>
<li><p>向关联添加自然语言约束,例如<code>{ player names must be unique }</code>。这样做的好处是,对于人类读者来说,这是一个明确无误的概念。您可以将其转换为更正式的OCL表达式,但这就像双重编码:OCL中的once和Python中的once</p>
</li>
<li><p>在名称后添加<code>{id}</code>,以说明名称是类的标识符。标识符原则上在类中是唯一的。然而,尽管大多数读者会理解这一点,但它是不明确的,因为UML没有定义标识符的语义:</p>
<blockquote>
<p>A Property may be marked, via the property isID, as being (part of) the identifier (if any) for Classifiers of which it is a member. <strong>The interpretation of this is left open</strong> but this could be mapped to implementations such as primary keys for relational database tables or ID attributes in XML.</p>
</blockquote>
<p>此外,这将防止不同游戏中的两名玩家同名</p>
</li>
</ul>
<p>在图表上,我展示了两种选择,但是如果没有明显的好处,我不应该使用<code>id</code></p>