Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为用户定义的类实现_delattr__Python_Python 3.x_Class - Fatal编程技术网

Python 为用户定义的类实现_delattr_

Python 为用户定义的类实现_delattr_,python,python-3.x,class,Python,Python 3.x,Class,你的MCVE不是一个实例属性。。。而是一个类属性。因此,\u delattr\u将无法在A的\u dict\u注册表中找到此属性,在调用del时会导致属性错误 在这种情况下,您需要使用del MyClasse.age删除属性,这也使得MyClasse的所有实例都无法访问该属性 如果您有兴趣了解如何为实例属性实现这一点,那么下面介绍如何实现。使用python3,对象自动成为任何类的超类。因此,您应该能够使用super调用它的\uuu delattr\uuu方法 Class MyClasse:

你的MCVE不是一个实例属性。。。而是一个类属性。因此,
\u delattr\u
将无法在
A
\u dict\u
注册表中找到此属性,在调用
del
时会导致
属性错误

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


如果您有兴趣了解如何为实例属性实现这一点,那么下面介绍如何实现。使用python3,
对象
自动成为任何类的超类。因此,您应该能够使用
super
调用它的
\uuu delattr\uuu
方法

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

现在,对刚刚创建的属性调用
del

class foo():
    def __delattr__(self, name):
        print(name)
        super().__delattr__(name)

f = foo()
f.xyz = 123

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

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

您正在使用Python2吗?如果您使用的是python3,正确的方法是调用
super
s
\uu delattr\uuuu
super()?函数定义后缺少冒号(除其他问题外…)我使用的是Python 3您的MCVE不是实例属性。。。而是一个类属性。
f.xyz
AttributeError: 'foo' object has no attribute 'xyz'