为用户定义的类实现__delattr__

时间:2018-01-13 23:00:53

标签: python python-3.x class

Class MyClasse:
     nom="me"
     age=24
     def __delattr__(self,name)
         if name=="nom":
               raise AttributeError( "you are not allowed")
          else:object.__delattr__(self,name)
A=MyClasse()
del A.age

1 个答案:

答案 0 :(得分:1)

你的MCVE所拥有的不是实例属性......而是一个类属性。因此,__delattr__无法在A的{​​{1}}注册表中找到此属性,当您致电__dict__时会导致AttributeError

在这种情况下,您需要使用del删除该属性,这也会使del MyClasse.age的所有实例无法访问该属性。

如果您有兴趣了解如何使其适用于实例属性,那么请查看方法。使用python3,MyClasse自动成为任何类的超类。因此,您应该可以使用object调用其__delattr__方法。

super

现在,在刚刚创建的属性上调用class foo(): def __delattr__(self, name): print(name) super().__delattr__(name) f = foo() f.xyz = 123

del

现在,尝试访问我们刚刚删除的属性:

del f.xyz    # works, printing the attribute name as well
xyz