簡體   English   中英

python對象構造函數沒有被調用?

[英]python object constructor not being called?

我正在使用python 2.7.3我有幾個類:

GpioSettings類:

class GpioSettings(object):
  __initialized__ = False
  PIR_PIN = 6
  GPIO = None
  RISING = None
  FALLING = None
  IN = None

  def __init__(self):
    print "starting to initialize gpio settings"
    if GpioSettings.__initialized__:
      print "gpio settings already initialized now"
      return
    else:
      print "initializing gpio settings now"
      GpioSettings.__initialized__ = True
      try:
        import RPi.GPIO as GPIO
        GpioSettings.GPIO = GPIO
        GpioSettings.RISING = GPIO.RISING
        GpioSettings.FALLING = GPIO.FALLING
        GpioSettings.IN = GPIO.IN
        GPIO.setmode(GPIO.BCM)
        GpioSettings.__piFunctionsLoaded__ = True
      except:
        GpioSettings.__piFunctionsLoaded__ = False

  @staticmethod
  def piFunctionsLoaded():
    return GpioSettings.__piFunctionsLoaded__

  @staticmethod
  def gpio():
    return GpioSettings.GPIO

皮爾類:

import os
import sys
import time
sys.path.append(os.path.abspath("/home/pi/garageMonitor/django/lib"))
from gpioSettings import GpioSettings
from osUtils import checkUser

class Pir(object):
  def __init__(self, callback):
    self.gpio = GpioSettings()
    if not self.gpio.piFunctionsLoaded():
      return
    self.gpio.gpio().setup(self.gpio.PIR_PIN, gpio.IN)
    self.gpio.gpio().add_event_detect(self.gpio.PIR_PIN, gpio.RISING, callback=callback, bouncetime=300)

def testCallback(channel):
  print "Motion Detected on " + str(channel)

if __name__ == "__main__":
  checkUser()
  gpio = GpioSettings()
  if gpio.piFunctionsLoaded():
    print "loaded"
    pir = Pir(testCallback)
    time.sleep(30)
  else:
    print "not loaded"

和python文件startPio.py:

import os
import sys
sys.path.append(os.path.abspath("/home/pi/garageMonitor/django/lib"))
from gpioSettings import GpioSettings
from osUtils import checkUser
from piPir import Pir

def pirCallback(channel):
  print "Motion Detected on " + str(channel)

if __name__ == "__main__":
  checkUser()
  print "initializing gpio now"
  gpio = GpioSettings()
  if gpio.piFunctionsLoaded():
    print "loaded here"
    pir = Pir(pirCallback)
  else:
    print "not loaded"

我正在嘗試使GpioSettings類成為單例,以便可以在多個類中使用它。 它可能未在適當的硬件上運行(並且RPi.GPIO可能不可用),因此我試圖將其與其他類屏蔽。

如果我運行:sudo python ./piPir.py,它工作正常(調用了GpioSettings),並且我得到了預期的輸出:

starting to initialize gpio settings
initializing gpio settings now
gpio settings already initialized now
loaded
starging to initialize gpio settings
gpio settings already initialized now
Motion Detected on 6

如果我運行:sudo python ./startPio.py(同時調用了GpioSettings和piPir),我得到以下信息:

sudo python ./startPio.py            
initializing gpio now
loaded here
Traceback (most recent call last):
  File "./startPio.py", line 17, in <module>
    pir = Pir(pirCallback)
  File "/home/pi/garageMonitor/django/lib/piPir.py", line 13, in __init__
    self.gpio.gpio().setup(self.gpio.PIR_PIN, gpio.IN)
AttributeError: GpioSettings instance has no attribute 'gpio'

令我喪命的是,當從startPio.py調用“ gpio = GpioSettings()”時,“開始初始化gpio設置”沒有顯示!

顯然,我很累,需要休息,因為我確信這很明顯。

因此,我將所有內容都放在一個文件中,以使調試更加容易:

class GpioSettings(object):
  __initialized__ = False
  PIR_PIN = 6
  GPIO = None
  RISING = None
  FALLING = None
  IN = None

  def __init__(self):
    print "starting to initialize gpio settings"
    if GpioSettings.__initialized__:
      print "gpio settings already initialized now"
      return
    else:
      print "initializing gpio settings now"
      GpioSettings.__initialized__ = True
      try:
        import RPi.GPIO as GPIO
        GpioSettings.GPIO = GPIO
        GpioSettings.RISING = GPIO.RISING
        GpioSettings.FALLING = GPIO.FALLING
        GpioSettings.IN = GPIO.IN
        GPIO.setmode(GPIO.BCM)
        GpioSettings.__piFunctionsLoaded__ = True
      except:
        GpioSettings.__piFunctionsLoaded__ = False

  @staticmethod
  def piFunctionsLoaded():
    return GpioSettings.__piFunctionsLoaded__

  @staticmethod
  def gpio():
    return GpioSettings.GPIO


##############################################################################
##############################################################################
##############################################################################

class Pir(object):
  def __init__(self, callback):
    print "intializing PIR"
    self.gpio = GpioSettings()
    if not self.gpio.piFunctionsLoaded():
      return
    self.gpio.gpio().setup(self.gpio.PIR_PIN, gpio.IN)
    self.gpio.gpio().add_event_detect(self.gpio.PIR_PIN, gpio.RISING, callback=callback, bouncetime=300)

##############################################################################
##############################################################################
##############################################################################


import os
import sys
sys.path.append(os.path.abspath("/home/pi/garageMonitor/django/lib"))
#from gpioSettings import GpioSettings
from osUtils import checkUser
#from piPir import Pir

def pirCallback(channel):
  print "Motion Detected on " + str(channel)

if __name__ == "__main__":
  checkUser()
  print "initializing gpio now"
  gpio = GpioSettings()
  if gpio.piFunctionsLoaded():
    print "loaded here"
    pir = Pir(pirCallback)
  else:
    print "not loaded"

而且效果很好!! ?? !!!

sudo python startPio.py
initializing gpio now
starting to initialize gpio settings
initializing gpio settings now
loaded here
intializing PIR
starting to initialize gpio settings
gpio settings already initialized now

我放棄。 感謝Corley Brigman,這是我的總結:

piPir.py:

    import os
    import sys
    sys.path.append(os.path.abspath("/home/pi/garageMonitor/django/lib"))
    import gpioSettings
    import RPi.GPIO as GPIO
    GPIO.setmode(GPIO.BCM)

class Pir(object):
  def __init__(self, callback):
    GPIO.setup(gpioSettings.PIR_PIN, GPIO.IN)
    GPIO.add_event_detect(gpioSettings.PIR_PIN, GPIO.RISING, callback=callback, bouncetime=300)

gpioSettings.py:

PIR_PIN = 6
DOOR_UP_PIN = 21
DOOR_DOWN_PIN = 22

gpioStart.py:

import os
import sys
import time
sys.path.append(os.path.abspath("/home/pi/garageMonitor/django/lib"))
from osUtils import checkUser
from piPir import Pir
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)

def pirCallback(channel):
  print "Motion Detected on " + str(channel)

if __name__ == "__main__":
  checkUser()
  pir = Pir(pirCallback)
  time.sleep(30000)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM