创建类的新实例并在Python中访问其实例变量

时间:2017-12-05 04:10:37

标签: python class turing-machines

所以,我在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)

1 个答案:

答案 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!']
>>>