【问题标题】:Python Class Method Error -- unbound requires instancePython 类方法错误——未绑定需要实例
【发布时间】:2016-11-30 20:58:39
【问题描述】:

我在打电话

Hardware.gpio_active(True)

这是我的硬件类:

import os
import glob
import time
import RPi.GPIO as GPIO

#class to manage hardware -- sensors, pumps, etc
class Hardware(object):
    #global vars for sensor 
    base_dir = '/sys/bus/w1/devices/'
    device_folder = glob.glob(base_dir + '28*')[0]
    device_file = device_folder + '/w1_slave'

    #global var for program
    temp_unit = 'F' #temperature unit, choose C for Celcius or F for F for Farenheit
    gpio_pin = 17 

    #function to enable GPIO
    @classmethod
    def gpio_active(active):
        #system params for sensor
        if active is True:
            os.system('modprobe w1-gpio')
            os.system('modprobe w1-therm')
            GPIO.setmode(GPIO.BCM)
            GPIO.setup(Hardware.gpio_pin, GPIO.OUT)
            print 'activating GPIO'
        else:
            print 'deactivating GPIO'
            GPIO.cleanup() 

我收到此错误:

TypeError: 必须使用硬件调用未绑定的方法 gpio_active() 实例作为第一个参数(得到 bool 实例)

我不想传递一个实例——我希望gpio_active() 基本上充当一个函数,但保留对静态类变量的可访问性。我认为这就是@classmethod 的用途。 @staticmethod 出现同样的错误。

我误会了什么?

【问题讨论】:

  • 不,staticmethod 您应该不会遇到同样的错误。这就是staticmethod 的描述,它没有隐式地将参数传递给函数。

标签: python class static-methods


【解决方案1】:

您可以使用staticmethod

@staticmethod
def gpio_active(active):
    ... 

但看起来您应该使用classmethod,因此您可以访问该类的其他静态/类方法,或访问类级变量:

@classmethod
def gpio_active(cls, active):
    ... 

然后将Hardware.gpio_pin替换为cls.gpio_pin

【讨论】:

  • 我需要访问其他类方法和变量。无论哪种方式我尝试我都会得到同样的错误:-/
  • 如果您执行上述操作,则不会出现该错误。您确定您的堆栈跟踪在每种情况下都没有不同吗?
【解决方案2】:

只需将def gpio_active(active) 替换为def gpio_active(cls, active)

在此处阅读有关@classmethod 的更多信息:https://julien.danjou.info/blog/2013/guide-python-static-class-abstract-methods

【讨论】:

  • 之前试过这个,同样的问题。
  • 如果你仍然得到TypeError ... got bool instance instead,我猜你可能忘记在运行之前保存你的代码了。
猜你喜欢
  • 2011-08-26
  • 2017-11-06
  • 1970-01-01
  • 2016-04-17
  • 1970-01-01
  • 2018-02-18
  • 1970-01-01
  • 2017-07-19
  • 1970-01-01
相关资源
最近更新 更多