对于那些花了一些时间用sml,ocaml,haskell等等的人,当你回到使用C,Python,Java等时,你会开始注意到你从未知道的东西丢失了。我正在用Python做一些事情,我意识到我真正想要的是一个功能样式的数据类型,例如(例如)
datatype phoneme = Vowel of string | Consonant of voice * place * manner
datatype voice = Voiced | Voiceless
datatype place = Labial | Dental | Retroflex | Palatal | Velar | Glottal
datatype manner = Stop | Affricate | Fricative | Nasal | Lateral
type syllable = phoneme list
有没有人有一种特殊的方式,他们喜欢在Python中模拟这个?
答案 0 :(得分:1)
对于voice
,place
和manner
之类的简单枚举,您可以使用这样的类:
class Enum(object):
def __init__(self, *values):
self._values = set(values)
for value in values:
setattr(self, value, value)
def __iter__(self):
return iter(self._values)
place = Enum('Labial', 'Dental', 'Retroflex', 'Palatal', 'Velar', 'Glottal')
a = place.Retroflex
if a == place.Labial:
print "How did this happen?"
for p in place:
print "possible value:", p
答案 1 :(得分:1)
正如......所示,您的语音,地点和方式类型只是枚举类型。有很多方法可以实现这些,例如
class voice(object):
Voiced, Voiceless = range(2)
然后你可以参考voice.Voiced和voice.Voiceless,等等。
问题是像音素这样的类型。在C中,实现类似的东西的通常方法是抓住你的鼻子并使用联合。像python这样的东西,你使用多态。首先,弄清楚您要对音素类型执行哪些操作。然后,将这些操作实现为Vowel类和Consonant类的成员函数。在C ++中,您可以将这些成员函数设置为虚拟,并为Vowel和Consonant创建一个抽象基类;在python中你可以通过鸭子打字而不用这样做而逃脱,尽管你仍然可以找到一个有用的基类。
所以,
class Vowel(object):
def SomeInitialMethod(self):
# ...
class Consonant(object):
def SomeInitialMethod(self):
# ...
p.SomeInitialMethod() # p can be either vowel or consonant
def SomeLaterFunction(p)
# p is assumed to be either a Vowel or a Consonant
if isinstance(p, Vowel):
# ...
elif isinstance(p, Consonant):
# ...
答案 2 :(得分:0)
您可以创建包含所需属性的类。
class Phoneme:
# ...
class Consonant(Phoneme):
def __init__(self, voice, place, manner):
self.voice = voice
self.place = place
self.manner = manner
# ...
h = Consonant('Voiceless', 'Glottal', 'Fricative')
# ...