AttributeError:“Rules”对象没有属性“\u Rules\uu temperature”

2024-10-01 19:30:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个程序,它的目标是从传感器获取输入,然后对这些传感器的输入进行操作,这些规则来自于在类中存储和调用的一些预定义规则。我在将传感器定义为的变量传递到rules类时遇到问题。在这里我得到了“Rules object has not attribute.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)

这就是问题所在:::

^{pr2}$

编辑,错误消息:

回溯(最近一次呼叫): 文件“H:\Project\Student\Prototype 1\事件原型.py“,第159行,英寸 规则=规则()

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


Tags: selfdatetimeiftimedeftimestampmotionlight
2条回答

子类不能访问私有成员(以__开头)。(好吧,它们可以通过一些黑客手段访问,但不应该)。 (见here

在您的例子中,__temperature是基类sensors的私有成员,但是您是从子类Rules访问它的。在

用一个下划线(__temperature->;_temperature)替换双下划线前缀,这样就可以开始了。在

双下划线成员被认为是私有的,您必须用定义该成员的类名为其添加前缀。在

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

class sensors:
    __temp = 42

assert sensors()._sensors__temp == 42

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

Rules().test()

相关问题 更多 >

    热门问题