没有调用python对象构造函数?

时间:2015-10-12 04:43:49

标签: python

我正在使用python 2.7.3 我有几个课程:

class 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

班Pir:

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

1 个答案:

答案 0 :(得分:1)

我放弃了。感谢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)