[SOS]不解的自定义类问题?

[SOS]不解的自定义类问题?

在自定义类例题中我有段代码不是很理解,请大家帮忙看看,谢谢!
在自定义时间类的__setattr__方法:
def __setattr__( self, name, value):
   
  if name == "hour" :
  
    if 0<=value<24 :
       self.__dict__[ "hour"] = value
    else:
        raise ValueError, "Invalid hour value : %d" % value

   elif name == "minute" or name == "second":
     
        if 0<=value<60:
           self.__dict__[ "_" + name] =value
        else :
           raise ValueError, "Invalid %s value : %d" % (mane,value)
    else:
     self.__dict__[name] = value
中这行代码是什么意思?是不是可以省略?
else:
     self.__dict__[name] = value
__dict__是实例的特殊属性,所有的实例属性都放在这个__dict__中。执行:

a.__dict__['b'] = 1

相当于

a.b = 1

在python语法参考中应该可以找到相关内容。

有时候使用__dict__是为了特殊要求,因为它是一个字典,因此可以将字符串作为key放进去。而a.b这种形式,如果属性名是在运行时生成的,就没办法了。

学习
谢谢
那么为什么if 0<=value<60:
           self.__dict__[ "_" + name] =value
中要加"_"前缀,而不是"__"前缀呢?2者区别是什么呢?"_"我老是在实际操作中会丢掉,它到底是做什么的呢?


"_"我的理解很笼统,就是知道它是约定属性通过类的方法来访问,但具体是什么意思不是很清楚,模模糊糊,是懂非懂,请前辈多指点下,谢谢.

"__"我的理解是,访问的属性名被修改,不能直接访问,要改路径名才能访问.不知道是不是很笼统.

还有就是上述代码中结尾有这么一段else:
                                            self.__dict__[name] = value

是不是可以省略?因为我的理解是上面小时\分钟\秒,都定义好了,超出范围的都有报错,这个是定义大于等于60的参数,那么还有什么作用

谢谢
self.__dict__[ "_" + name] =value

这是你的程序的用法。"_"+name只是一个字符串而已。

对于_开头的实例属性没有什么特别的。而对于__开头的属性可以认为是私有属性,不能被外面直接使用。如:

[Copy to clipboard] [ - ]
CODE:
class A:
    def __init__(self):
        self._a = 1
        self.__b = 2

a = A()
a._a #有值
a.__b #抛出异常

不知道你的代码为什么这么写。不写self.__dict__[name] = value,有办法保存就行。
谢谢