简体   繁体   English

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

[英]python object constructor not being called?

I am using python 2.7.3 I have a couple of classes: 我正在使用python 2.7.3我有几个类:

class GpioSettings: 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

class 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"

and python file startPio.py: 和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"

I am trying to make a singleton of the GpioSettings class so that I can use it in multiple classes. 我正在尝试使GpioSettings类成为单例,以便可以在多个类中使用它。 It may not be running on the appropriate hardware (and RPi.GPIO may not be available) so I am trying to shield this from the other classes. 它可能未在适当的硬件上运行(并且RPi.GPIO可能不可用),因此我试图将其与其他类屏蔽。

If I run: sudo python ./piPir.py it works fine (GpioSettings is called) and I get the expected output: 如果我运行: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

If I run: sudo python ./startPio.py (both GpioSettings and piPir are called) I get the following: 如果我运行: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'

What's killing me is that "starting to initialize gpio settings" does not get printed when "gpio = GpioSettings()" is called from startPio.py! 令我丧命的是,当从startPio.py调用“ gpio = GpioSettings()”时,“开始初始化gpio设置”没有显示!

Obviously I am tired and need some rest as I am sure it is obvious. 显然,我很累,需要休息,因为我确信这很明显。

So I put everything into one file to make debugging a little easier: 因此,我将所有内容都放在一个文件中,以使调试更加容易:

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"

And it works fine!!??!!! 而且效果很好!! ?? !!!

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

I gave up. 我放弃。 Thanks to Corley Brigman, here is what I wound up with: 感谢Corley Brigman,这是我的总结:

piPir.py: 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: gpioSettings.py:

PIR_PIN = 6
DOOR_UP_PIN = 21
DOOR_DOWN_PIN = 22

gpioStart.py: 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