【问题标题】:self argument not defined when calling method?调用方法时未定义self参数?
【发布时间】:2014-05-01 13:42:34
【问题描述】:

您好,我正在开发一个使用 Phidg​​et 传感器的系统,但在尝试将一些变量写入数据库时​​遇到了一些问题。我已经阅读了大量关于类和调用变量的内容,但我就是无法运行此代码。

我的代码在下面,你可以看到我在调用数据库方法时输入了“self”参数,但它抱怨“self”没有定义。如果我没有 self ,我会收到一条抱怨“database() 缺少 1 个必需的位置参数:'self'”

connection = sqlite3.connect('testing.db')      
cursor = connection.cursor()

class sensors():

    def interfaceKitAttached(self, e):
        attached = e.device
        print("InterfaceKit %i Attached!" % (attached.getSerialNum()))

    def sensorInputs(self, e):



        temperature = (interfaceKit.getSensorValue(0)*0.2222 - 61.111)
        self.sound =  (16.801 * math.log((interfaceKit.getSensorValue(1))+ 9.872))
        light = (interfaceKit.getSensorValue(2))

        print("Temperature is: %i " % temperature)
        print("Sound is : %i" %self.sound)
        print("Light is: %i \n" %light)

        interfaceKit.setSensorChangeTrigger(0, 25)
        interfaceKit.setSensorChangeTrigger(1, 35)
        interfaceKit.setSensorChangeTrigger(2, 60)


    def database(self):


        cursor.execute('''CREATE TABLE events1
        (sensor text, value text)''')

        cursor.execute ('INSERT INTO events1 VALUES (?, ?)', ('sounding', self.sound))


        connection.commit()
        connection.close()




try:
    interfaceKit.setOnAttachHandler(interfaceKitAttached)
    interfaceKit.setOnSensorChangeHandler(sensorInputs)
    database(self)

谢谢

【问题讨论】:

  • 我已经修复了部分代码格式问题,但我不确定我是否正确缩进了末尾的 try 块。没有excepttry 子句是不合法的,所以我不确定它应该如何工作。
  • 抱歉,我以为我复制了所有代码(包括 except 子句),但显然不是
  • 没关系,只需编辑问题以将完整代码放入(或至少相关部分)。确保它在之后正确缩进。最简单的方法通常是从编辑器中粘贴它,然后突出显示它并单击{} 按钮让 Stack Overflow 缩进更多。

标签: python class methods self


【解决方案1】:

self 不是您在括号中传递的参数。 self 是一个参数,传递如下:

object.method()

在这里,您实际上将对象作为参数传递,self

因此,在您的情况下,您实际上需要以object.method() 的形式调用该方法,其中object 是您的方法所在的类的实例。在这种情况下,您的类是sensors

所以你不要这样做:

database(self)

你会的

sensors_object = sensors()

sensors_object.database()

当您调用sensors_object = sensors() 调用时,您会创建一个新的sensors 对象。然后在下一行调用 OBJECT 的方法而不是 CLASS 的方法。

[注意:] 我建议您创建一个def __init__(self): 方法。这是在创建类的新实例时调用的方法。在这个__init__ 方法中,您将所需的所有不同变量初始化为self.variable_name = something

【讨论】:

  • 道歉我认为这实际上是一些相对简单的事情,但是在通过以下方式调用我的方法后:sensors.database(self) 我收到“未定义传感器”的错误
  • @user3375667,这对您有帮助吗?您还有什么想问的吗?
猜你喜欢
  • 2019-01-14
  • 2023-03-07
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 2021-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多