我想访问用类定义的变量值,但我尝试的所有操作都会导致一种或另一种错误。
我将包含 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'
正是在这一点上,我意识到我需要帮助,我真的希望有人能引导我走向正确的方向。
感谢您的帮助。
在从类中读取变量(在这种情况下是属性)之前,您必须声明并初始化它。
您绝对可以通过添加
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
。