为什么hasattr在使用@property方法的类和实例上的行为有所不同?

辛巴

在的类中实现了只写属性@property奇怪的是,hasattr具有此属性的类和相应实例的行为不同。

from werkzeug.security import generate_password_hash, check_password_hash
from flask_login import UserMixin


class User(Base, UserMixin):
    # codes omitted...

    @property
    def password(self):
        raise AttributeError("password is a write-only attribute!")

    @password.setter
    def password(self, password):
        self.password_hash = generate_password_hash(password)

    def verify_password(self, password):
        return check_password_hash(self.password_hash, password)
In [6]: hasattr(User,'password')
Out[6]: True

In [7]: u1=User()

In [9]: hasattr(u1,'password')
Out[9]: False

In [12]: getattr(User,'password')
Out[12]: <property at 0x1118a84a8>

In [13]: getattr(u1,'password')
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-13-b1bb8901adc7> in <module>
----> 1 getattr(u1,'password')

~/workspace/python/flask_web_development/fisher/app/models.py in password(self)
     82     @property
     83     def password(self):
---> 84         raise AttributeError("password is a write-only attribute!")
     85
     86     @password.setter

AttributeError: password is a write-only attribute!

根据的结果getattrgetattr(u1, 'password')尝试执行该方法并引发错误,而getattr(User, 'password')没有执行该@property方法。他们为什么表现不同?

提格布

属性是描述符


关于getattr

当您通过getattr或对象(u1上的点符号访问属性,并且该对象()的类User碰巧有一个您要访问的名称的描述符时,该描述符的__get__方法称为1,就像您问题getattr(u1, 'password')在您的特定情况下,AttributeError将执行您在getter中定义的逻辑(提高)。

随着getattr(User, 'password')传递给该实例__get__的方法是None,在这种情况下,__get__刚刚返回的描述符本身,而不是执行你实现吸气逻辑。

1有一些特殊的规则,取决于您是数据描述符还是非数据描述符,如描述符方法说明中所述。


关于hasattr

hasattr(u1, 'password')返回,False因为getattr(u1, 'password')会引发错误。看到这个问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么multiprocessing.Process在Windows和Linux上对于全局对象和函数参数的行为有所不同

使用libfaketime时,setTimeout在Mac OS和Linux上的行为有所不同

为什么在C#和Java中,对流的“关闭”调用的行为有所不同?

为什么`Paths.get`方法的行为有所不同?

为什么中断和isInterrupted的行为方式有所不同?

为什么嵌套类在Java和C#之间的行为有所不同?

为什么空条件运算符对于==和.Equals()的行为会有所不同?

为什么`-lt`对于字符和字符串的行为有所不同?

为什么Java Lambda在实例字段初始化方面与嵌套类有所不同?

为什么在以“ self”为前缀时,Ruby实例方法调用的行为会有所不同?

为什么hasOwnProperty对于构造函数和实例的行为有所不同?

为什么Python范围对于列表变量和字符串变量的行为似乎有所不同?

JavaFx MediaPlayer在单元测试和应用程序中的行为有所不同,为什么?

为什么使用交叉元运算符时** 2和²的行为会有所不同?

为什么Facebook登录程序在模拟器和实体电话之间的行为有所不同

为什么numpy导入的行为有所不同?

为什么groupby操作的行为有所不同

Spock中最终类的模拟实例在测试和开发代码中的行为有所不同

如果使用相同的种子,引导方法的结果为什么会有所不同?

为什么在使用ICustomTypeDescriptor时TypeDescriptor.GetProperties对于类型和对象的行为会有所不同

为什么pidof和pgrep的行为有所不同?

为什么在本地运行和远程运行时,webbrowser lib的行为有所不同?

当类中的counter较大时,为什么java线程的行为会有所不同?

Java:为什么for和while循环之间的内存使用有所不同?

为什么pop_back()方法在vector和list类中有所不同?

为什么ContextMenuOpening的Source对于Canvas和UserControl的行为有所不同?

为什么hide()的行为有所不同?

为什么to_sym的行为有所不同?

当类在函数内时,为什么类中的全局行为会有所不同?