[英]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.