所以,我在Python中构建图灵机,我已经到了需要在解析器中实例化我的图灵机类的地步,但我似乎无法得到正确的语法。
以下是我定义我的TM的方式:
class TM(object):
def __init__(self, states, start, accept, reject, alpha, tAlpa, tape,
transition, head):
self.states = []
self.start = start
self.accept = accept
self.reject = reject
self.alpha = []
self.tAlpha =[]
self.tape = LinkedList(tape)
self.transitions = []
self.head = head
return;
所以我需要在Parser类中创建一个实例: 例如:
class Parser:
*some other logic*
tm = TM()
tm.states.append(something)
答案 0 :(得分:1)
非常快速的示例,向您展示所需位置参数的效果:
>>> class Temp:
def __init__(self, **kwargs):
if kwargs:
self.temp = kwargs['temp']
>>> t = Temp()
>>> class Temp2:
def __init__(self, opt1 = None, opt2 = None):
self.opt1 = opt1
self.opt2 = opt2
>>> t2 = Temp2()
>>> class Temp3:
def __init__(self, req, opt1 = None, opt2 = None):
self.req = req
self.opt1 = opt1
self.opt2 = opt2
>>> t3 = Temp3()
Traceback (most recent call last):
File "<pyshell#16>", line 1, in <module>
t3 = Temp3()
TypeError: __init__() missing 1 required positional argument: 'req'
>>>
在第一个类中,**kwargs
允许我实例化并传递我想要的任何关键字参数。这是一个星期的例子,但可以指出你可以对存在做一些初始化检查,然后为关键名称进行子检查。
在第二节课中,使用... = None
我默认参数,如果没有提供。同样,解释器很高兴,因为所有参数都收到了值!
在最后一节课中,我们看到了错误。请注意,req
未使用默认值定义。因此,解释器要求它接收一个来实例化它。当我不提供它时,你得到TypeError
告诉你。
简而言之,如果没有正确地实例化类,您将无法访问其任何属性或使用其成员函数!
修改:希望更详细地解释一下
此外,在OOP / D中,尝试找到避开长__init__()
函数头的方法。尝试这样的事情:
>>> class TM:
def __init__(self, **kwargs):
init_args = {'states': [],
'start': None,
'accept': None,
'reject': None,
'alpha': [],
'tAlpha': [],
'tape': None, # make later
'transitions': [],
'head': None}
for arg, default in init_args.items():
setattr(self, arg, kwargs.get(arg, default))
>>> tm = TM()
再次,使用**kwargs
确定何时我想在初始化时为对象提供值,但我使用预定义的列表来默认它!打破一些:
init_args
是一个现成的字典(就像kwargs
一样。不要让**
吓到你,它只是字典unpacking operator。列表中也有一个字典{}字面上只有一个*
。
for arg, default ... setattr(self, arg, kwargs.get(arg, default))
遍历我们预定义的参数容器,然后使用self.[insert_arg]
中的值创建kwargs.get()
属性。它会查找arg
,如果找不到,请使用我们已有的default
!
所以稍后当您想要在Parser
班级中进行单一属性访问时:
>>> class TM:
def __init__(self, **kwargs):
init_args = {'states': [],
'start': None,
'accept': None,
'reject': None,
'alpha': [],
'tAlpha': [],
'tape': None, # make later
'transitions': [],
'head': None}
for arg, default in init_args.items():
setattr(self, arg, kwargs.get(arg, default))
>>> tm = TM()
>>> tm.states.append('it works!')
>>> tm.states
['it works!']
>>>