首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AttributeError:“规则”对象没有属性“_Rules__temperature”

AttributeError:“规则”对象没有属性“_Rules__temperature”
EN

Stack Overflow用户
提问于 2014-04-05 11:23:40
回答 2查看 1.8K关注 0票数 1

我有一个程序,它的目标是从传感器获取输入,然后对来自这些传感器的输入进行操作,这些输入来自预先定义的规则,这些规则在类中被存储和调用。我很难将传感器定义为的变量传递到rules类中。当我得到'Rules对象没有属性.rules_temperature‘的错误时,我的代码如下:

代码语言:javascript
复制
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)

这就是问题所在:

代码语言:javascript
复制
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)

编辑,错误消息:

回溯(最近一次调用):theRule = Rules()中的文件"H:\Project\Student\Prototype theRule“第159行

文件“H:\Project\Student\ 1\eventProto.py",第146行,在init self.__temperature AttributeError:'Rules‘对象中没有属性'Rules_temperature’

EN

回答 2

Stack Overflow用户

发布于 2014-04-05 11:37:34

子类不能访问私有成员(从__开始)。(嗯,可以用一些黑客来访问它们,但不应该这样)。(见here)

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

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

票数 2
EN

Stack Overflow用户

发布于 2014-04-05 11:34:20

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

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

代码语言:javascript
复制
class sensors:
    __temp = 42

assert sensors()._sensors__temp == 42

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

Rules().test()
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22880239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档