【问题标题】:Creating a new instance of a class and accessing its instance variables in Python在 Python 中创建一个类的新实例并访问其实例变量
【发布时间】:2017-12-05 04:10:36
【问题描述】:

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

【问题讨论】:

  • 到目前为止你有什么代码,Python 抛出了什么错误?
  • 当我尝试像上面的例子一样实例化它时,它会要求它提供参数,但我只需要能够访问 TM 类的实例变量。
  • 您在__init__() 中定义了大量必需 参数。所以当然当你不提供它们时,你不能实例化对象!
  • 它刚刚点击...我一直在看错。谢谢!

标签: python class turing-machines


【解决方案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!']
>>> 

【讨论】:

    猜你喜欢
    • 2022-08-11
    • 1970-01-01
    • 2012-05-21
    • 2019-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多