2016-07-27 16 views
0

IchPython Klasse Methode Error - ungebundene erfordert Instanz

Hardware.gpio_active(True) 

Das ist meine Hardware-Klasse aufrufen:

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() 

ich diesen Fehler:

TypeError: unbound method gpio_active() must be called with Hardware instance as first argument (got bool instance instead)

I don Ich möchte keine Instanz übergeben - ich möchte gpio_active() grundsätzlich als eine Funktion fungieren, aber Zugriff auf statische Klassenvariablen behalten. Ich dachte, das ist was @classmethod war für. Ich bekomme den gleichen Fehler mit @staticmethod.

Was bin ich Missverständnis?

+1

Nein, mit 'staticmethod' Sie sollten * nicht * den gleichen Fehler bekommen. Das ist die Beschreibung von [staticmethod] (https://docs.python.org/2.7/library/functions.html#staticmethod). Es übergibt nicht implizit ein Argument an eine Funktion. –

Antwort

1

Ersetzen Sie einfach def gpio_active(active) zu def gpio_active(cls, active).

mehr über @classmethod hier lesen: https://julien.danjou.info/blog/2013/guide-python-static-class-abstract-methods

+0

Versucht dies früher, dasselbe Problem. –

+1

Wenn Sie immer noch "TypeError ... bool instance" erhalten, werden Sie wahrscheinlich vergessen, Ihren Code zu speichern, bevor Sie ihn ausführen. – Kixoms

+0

Richtig, mein Code wurde zwischengespeichert. Vielen Dank. –

1

Sie können eine staticmethod verwenden:

@staticmethod 
def gpio_active(active): 
    ... 

Aber es sieht aus wie Sie, dass ein classmethod so haben Sie Zugriff auf andere statische/Klassenmethoden verwendet werden sollte, Klasse oder Zugriff auf die Variablen auf Klassenebene:

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

Dann ersetzen Sie Hardware.gpio_pin mit cls.gpio_pin

+0

Ich brauche Zugriff auf andere Klassenmethoden und Variablen. So oder so ich versuche ich den gleichen Fehler: -/ –

+0

Sie können nicht diesen Fehler bekommen, wenn Sie die oben tun. Bist du sicher, dass dein Stacktrace nicht in jedem Fall anders ist? – DaveBensonPhillips

+0

Danke, mein Code war zwischengespeichert, Sie haben Recht. –