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

2024-10-05 18:05:18 发布

您现在位置:Python中文网/ 问答频道 /正文

所以,我正在用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;

所以我需要在解析器类中创建一个实例: 例如:

class Parser:
*some other logic*

tm = TM()
tm.states.append(something)

Tags: 实例selfalpha解析器语法startheadclass
1条回答
网友
1楼 · 发布于 2024-10-05 18:05:18

非常快速的示例向您展示了所需位置参数的效果:

>>> 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))迭代预定义的参数容器,然后用kwargs.get()中的值创建一个self.[insert_arg]属性。它寻找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!']
>>> 

相关问题 更多 >