从类对象中检索 Python 中的变量值

问题描述 投票:0回答:1

我想访问用类定义的变量值,但我尝试的所有操作都会导致一种或另一种错误。

我将包含 Python 代码的摘录,该代码定义了从 DS3231 实时时钟读取和显示日期、时间和日期的类:

class ds3231(object):
    weekday  = ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];
    address = 0x68
    start_reg = 0x00
    alarm1_reg = 0x07
    control_reg = 0x0e
    status_reg = 0x0f
    
    def __init__(self,i2c_port,i2c_scl,i2c_sda):
        self.bus = I2C(i2c_port,scl=Pin(i2c_scl),sda=Pin(i2c_sda))
   
    def read_time(self):
        t = self.bus.readfrom_mem(int(self.address),int(self.start_reg),7)
        sec = t[0]&0x7F  #second
        min = t[1]&0x7F  #minute
        hrs = t[2]&0x3F  #hour
        wek = t[3]&0x07  #week
        day = t[4]&0x3F  #day
        mon = t[5]&0x1F  #month
        yer = t[6]&0x3F  #year
        print("%s %02x:%02x:%02x %02x/%02x/20%x" %(self.weekday[wek-1],hrs,min,sec,day,mon,yer))

剩余代码如下:

rtc = ds3231(I2C_PORT,I2C_SCL,I2C_SDA)

while True:
    
    rtc.read_time()
    sleep(3)

输出为:

Monday 12:23:09 07/11/2022

但是,我想做的是访问类外部的变量,以便我可以利用可用的数据做更多事情,例如:

print ('The year is ' + yer)

但这会导致:

NameError: name 'yer' isn't defined

进一步的研究表明我需要指定类和变量,我推断如下:

print ('The year is ' + (read_time.yer))

但这会导致:

NameError: name 'read_time' isn't defined

我尝试了很多不同的变体,包括尝试将值作为字符串读入另一个变量,然后尝试输出它,如下所示:

ryear = str(ds3231.yer())
print (rdate)

但这会导致:

AttributeError: type object 'ds3231' has no attribute 'yer'

正是在这一点上,我意识到我需要帮助,我真的希望有人能引导我走向正确的方向。

感谢您的帮助。

python class object variables real-time-clock
1个回答
1
投票

在从类中读取变量(在这种情况下是属性)之前,您必须声明并初始化它。

您绝对可以通过添加

read_time
关键字在
self
函数中执行此操作:

class ds3231:

...
   
    def read_time(self):
        t = self.bus.readfrom_mem(int(self.address), int(self.start_reg), 7)
        self.sec = t[0] & 0x7F  # second
        self.min = t[1] & 0x7F  # minute
        self.hrs = t[2] & 0x3F  # hour
        self.wek = t[3] & 0x07  # week
        self.day = t[4] & 0x3F  # day
        self.mon = t[5] & 0x1F  # month
        self.yer = t[6] & 0x3F  # year
        print("%s %02x:%02x:%02x %02x/%02x/20%x" %
              (self.weekday[self.wek-1], self.hrs, self.min, self.sec, self.day, self.mon, self.yer))

要在函数外部使用这些属性,您必须与 insatnttiated 类一起解决它。但在这种情况下,您首先必须至少调用该函数一次。

rtc = ds3231(I2C_PORT, I2C_SCL, I2C_SDA)
rtc.read_time()
ryear = str(rtc.yer)
print (ryear)

此外,属性并不像函数那样被调用,因此在

()
之后没有
yer

你的命名有一点错误:

ryear = str(ds3231.yer())
print (rdate)

此处

rdate
未定义,您在上面的行中使用了
ryear

© www.soinside.com 2019 - 2024. All rights reserved.