Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 属性错误:';规则';对象没有属性'_规则uu温度';_Python_Class_Object - Fatal编程技术网

Python 属性错误:';规则';对象没有属性'_规则uu温度';

Python 属性错误:';规则';对象没有属性'_规则uu温度';,python,class,object,Python,Class,Object,我有一个程序,它的目标是从传感器获取输入,然后对这些传感器的输入采取行动,这些输入来自一些预定义的规则,这些规则存储在类中并在类中调用。我在将传感器定义为的变量传递到rules类中时遇到问题。其中我得到的错误为“Rules对象没有属性。Rules\u temperature”。我的代码如下: class myInterfaceKit(): __interfaceKit = None def __init__(self ): try:

我有一个程序,它的目标是从传感器获取输入,然后对这些传感器的输入采取行动,这些输入来自一些预定义的规则,这些规则存储在类中并在类中调用。我在将传感器定义为的变量传递到rules类中时遇到问题。其中我得到的错误为“Rules对象没有属性。Rules\u temperature”。我的代码如下:

class myInterfaceKit():
    __interfaceKit = None

    def __init__(self ):       
        try:
            self.__interfaceKit = InterfaceKit()    
        except RuntimeError as e:
            print("Runtime Exception: %s" % e.details)
            print("Exiting....")
            exit(1)

    def open(self):
        try:
            self.__interfaceKit.openPhidget()
        except PhidgetException as e:
            print("Phidget Exception %i: %s" % (e.code, e.details))

    def getInterfaceKit(self):
        return self.__interfaceKit

    def getSensor(self, sensor):
        return self.__interfaceKit.getSensorValue(sensor)


class sensors():

    __sound = 0
    __temperature = 0
    __light = 0
    __motion = 0

    __dbName = ""
    __interfaceKit = None
    __connection = None
    __rules = None

    def __init__(self, theInterfaceKit, dbName):
        self.__sound = 0
        self.__temperature=0
        self.__light=0
        self.__motion=0
        self.__timeStamp=time.time()
        self.__strTimeStamp=datetime.datetime.fromtimestamp(self.__timeStamp).strftime('%Y-%m-%d %H:%M:%S')
        self.__dbName = dbName
        self.__interfaceKit = theInterfaceKit
        self.__connection = sqlite3.connect('testing1.db', check_same_thread=False) ######


    def interfaceKitAttached(self, e):
        attached = e.device
        print("InterfaceKit %i Attached!" % (attached.getSerialNum()))

        self.__interfaceKit.getInterfaceKit().setSensorChangeTrigger(0, 5)
        self.__interfaceKit.getInterfaceKit().setSensorChangeTrigger(1, 35)
        self.__interfaceKit.getInterfaceKit().setSensorChangeTrigger(2, 60)
        self.__interfaceKit.getInterfaceKit().setSensorChangeTrigger(3, 200)

    def sensorInputs(self, e):

        temperature = (self.__interfaceKit.getSensor(0)*0.2222 - 61.111)
        sound =  (16.801 * math.log((self.__interfaceKit.getSensor(1))+ 9.872))
        light = (self.__interfaceKit.getSensor(2))
        motion = (self.__interfaceKit.getSensor(3)) 

        # check temperature has changed - if yes, save and update
        if temperature != self.__temperature:
            self.__timeStamp=time.time()
            self.__strTimeStamp=datetime.datetime.fromtimestamp(self.__timeStamp).strftime('%Y-%m-%d %H:%M:%S')
            self.__temperature = temperature
            print("Temperature is: %i:" % self.__temperature)

            self.writeToDatabase( 'temperature', self.__temperature, self.__strTimeStamp)


         #check sound has changed - if yes, save and update
        if sound != self.__sound:
            self.__timeStamp=time.time()
            self.__strTimeStamp=datetime.datetime.fromtimestamp(self.__timeStamp).strftime('%Y-%m-%d %H:%M:%S')
            self.__sound = sound
            print("Sound is: %i " % self.__sound)
            self.writeToDatabase( 'sound', self.__sound, self.__strTimeStamp )

         #check light has changed - if yes, save and update
        if light != self.__light:
            self.__timeStamp=time.time()
            self.__strTimeStamp=datetime.datetime.fromtimestamp(self.__timeStamp).strftime('%Y-%m-%d %H:%M:%S')
            self.__light = light
            print("Light is: %i " % self.__light)
            self.writeToDatabase( 'light', self.__light, self.__strTimeStamp )


        if motion != self.__motion:
            self.__motion = motion
            print ("motion is %i" % self.__motion)


    def openDatabase(self):
        cursor = self.__connection.cursor()
        cursor.execute("CREATE TABLE " + self.__dbName + " (sensor text, value text, time_stamp text)")

    def writeToDatabase(self, sensorType, data, time):
        cursor = self.__connection.cursor()
        cursor.execute("INSERT INTO " + self.__dbName + " VALUES (?, ?, ?)", (sensorType, data, time))
        self.__connection.commit()

    def closeDatabase():
        self.__connection.close()

    def start(self):
        try:
            self.__interfaceKit.getInterfaceKit().setOnAttachHandler(self.interfaceKitAttached)
            self.__interfaceKit.getInterfaceKit().setOnSensorChangeHandler(self.sensorInputs)
            self.openDatabase()
        except PhidgetException as e:
            print("Phidget Exception %i: %s" % (e.code, e.details))
            print("Exiting....")
            exit(1)
这就是问题所在:

class Rules(sensors):

    __tempLower=0
    __tempUpper=0


    def __init__(self):
        self.__tempLower=28
        self.__tempUpper=30
        self.__temperature

    def tempRule(self, sensors): ##Temperature rule
        if self.__temperature == self.__tempLower:
            print("testing")


phidgetInterface = myInterfaceKit()
phidgetInterface.open()

theSensors = sensors(phidgetInterface, "event156")
theSensors.start()

theRule = Rules()
theRule.tempRule()

chr = sys.stdin.read(1)
编辑,错误消息:

回溯(最近一次呼叫最后一次): 文件“H:\Project\Student\Prototype 1\eventProto.py”,第159行,在 规则=规则()

文件“H:\Project\Student\Prototype 1\eventProto.py”,第146行,在init 自身温度
AttributeError:“Rules”对象没有属性“Rules\u temperature”

双下划线成员被认为是私有的,您必须在这些成员前面加上定义了该成员的类名

像这样使用这些神奇的私人成员:

class sensors:
    __temp = 42

assert sensors()._sensors__temp == 42

class Rules(sensors):
    def test(self):
        assert self._sensors__temp == 42

Rules().test()
子类无法访问私有成员(以
开头)。(好吧,可以使用一些黑客来访问它们,但不应该)。
(见附件)

在您的情况下,
\u temperature
是基类
传感器
的私有成员,但您正在从子类
规则
访问它


将双下划线前缀替换为一个下划线(
\uu temperature
->
\u temperature
),您就可以开始了。

请正确设置代码格式,并包含错误日志。您能解释一下为什么要使用双前导下划线吗?说:“一般来说,双前导下划线只能用于避免名称与设计为子类的类中的属性冲突。”