diff --git a/python_jsonschema_objects/classbuilder.py b/python_jsonschema_objects/classbuilder.py
index 65d8660..9ef9dc8 100644
--- a/python_jsonschema_objects/classbuilder.py
+++ b/python_jsonschema_objects/classbuilder.py
@@ -251,16 +251,6 @@ class ProtocolBase(collections.MutableMapping):
         except AttributeError:
             raise KeyError(key)
 
-    def __setitem__(self, key, val):
-        return setattr(self, key, val)
-
-    def __delitem__(self, key):
-        if key in self._extended_properties:
-            del self._extended_properties[key]
-            return
-
-        return delattr(self, key)
-
     def __getattr__(self, name):
         if name in self.__prop_names__:
             raise KeyError(name)
@@ -270,6 +260,24 @@ class ProtocolBase(collections.MutableMapping):
             "{0} is not a valid property of {1}".format(name, self.__class__.__name__)
         )
 
+    def __setitem__(self, key, val):
+        return setattr(self, key, val)
+
+    def __delitem__(self, key):
+        return delattr(self, key)
+
+    def __delattr__(self, name):
+        if name in self._extended_properties:
+            del self._extended_properties[name]
+            return
+
+        if name in self.__prop_names__:
+            prop = getattr(self.__class__, self.__prop_names__[name])
+            prop.__delete__(self)
+            return
+
+        return delattr(self, name)
+
     @classmethod
     def propinfo(cls, propname):
         if propname not in cls.__propinfo__:
diff --git a/python_jsonschema_objects/descriptors.py b/python_jsonschema_objects/descriptors.py
index a53bcbc..fde0ceb 100644
--- a/python_jsonschema_objects/descriptors.py
+++ b/python_jsonschema_objects/descriptors.py
@@ -132,4 +132,4 @@ class AttributeDescriptor(object):
         if prop in obj.__required__:
             raise AttributeError("'%s' is required" % prop)
         else:
-            del obj._properties[prop]
+            obj._properties[prop] = None

Missing __delattr__
The class `ProtocolBase` misses a specific `__delattr__` implementation. This is required to delete extended properties using `delattr` or `del`. Currently, extended properties can be set with `setattr` but only deleted with array syntax:
```
>>> import python_jsonschema_objects as pjs
>>> builder = pjs.ObjectBuilder({'title': 'Test', 'type': 'object'})                                         
>>> ns = builder.build_classes()
>>> x = ns.Test()
>>> x.foo = 42
>>> x.foo
<Literal<int> 42>
>>> del x.foo
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: foo
>>> delattr(x, 'foo')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: foo
>>> del x['foo']
```
As far as I can tell, the implementation of `__delattr__` can be identical to the current `__delitem__`, ideally `__delitem__` should simply call `__delattr__` (for symmetry with `__setitem__` and `__setattr__`).
diff --git a/test/test_regression_156.py b/test/test_regression_156.py
index 8bb3af4..138bbe0 100644
--- a/test/test_regression_156.py
+++ b/test/test_regression_156.py
@@ -3,7 +3,9 @@ import python_jsonschema_objects as pjo
 
 
 def test_regression_156(markdown_examples):
-    builder = pjo.ObjectBuilder(markdown_examples['MultipleObjects'], resolved=markdown_examples)
+    builder = pjo.ObjectBuilder(
+        markdown_examples["MultipleObjects"], resolved=markdown_examples
+    )
     classes = builder.build_classes(named_only=True)
 
     er = classes.ErrorResponse(message="Danger!", status=99)
diff --git a/test/test_regression_165.py b/test/test_regression_165.py
new file mode 100644
index 0000000..0b5fd97
--- /dev/null
+++ b/test/test_regression_165.py
@@ -0,0 +1,50 @@
+import python_jsonschema_objects as pjs
+import pytest
+
+
+@pytest.fixture
+def testclass():
+    builder = pjs.ObjectBuilder({"title": "Test", "type": "object"})
+    ns = builder.build_classes()
+    return ns.Test()
+
+
+def test_extra_properties_can_be_deleted_with_item_syntax(testclass):
+    testclass.foo = 42
+
+    assert testclass.foo == 42
+    del testclass["foo"]
+
+    # Etestclasstra properties not set should raise AttributeErrors when accessed
+    with pytest.raises(AttributeError):
+        testclass.foo
+
+
+def test_extra_properties_can_be_deleted_with_attribute_syntax(testclass):
+    testclass.foo = 42
+
+    assert testclass.foo == 42
+    del testclass.foo
+
+    # Extra properties not set should raise AttributeErrors when accessed
+    with pytest.raises(AttributeError):
+        testclass.foo
+
+
+def test_extra_properties_can_be_deleted_directly(testclass):
+    testclass.foo = 42
+
+    assert testclass.foo == 42
+    delattr(testclass, "foo")
+
+    # Extra properties not set should raise AttributeErrors when accessed
+    with pytest.raises(AttributeError):
+        testclass.foo
+
+
+def test_real_properties_arent_really_deleted(Person):
+    p = Person(age=20)
+
+    assert p.age == 20
+    del p.age
+    assert p.age == None

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest pytest-mock
apt-get update apt-get install -y gcc
3.6
requirements/base.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs==22.2.0
certifi==2021.5.30
importlib-metadata==4.8.3
inflection==0.5.1
iniconfig==1.1.1
jsonschema==3.2.0
Markdown==3.3.7
packaging==21.3
pluggy==1.0.0
py==1.11.0
pyparsing==3.1.4
pyrsistent==0.18.0
pytest==7.0.1
pytest-mock==3.6.1
-e git+https://github.com/cwacek/python-jsonschema-objects.git@e5ed9cabc13f1b7f2004b6e4bb9b04e525d7cf54#egg=python_jsonschema_objects
six==1.17.0
tomli==1.2.3
typing_extensions==4.1.1
zipp==3.6.0

name: python-jsonschema-objects
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=21.2.2=py36h06a4308_0
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - attrs==22.2.0
      - importlib-metadata==4.8.3
      - inflection==0.5.1
      - iniconfig==1.1.1
      - jsonschema==3.2.0
      - markdown==3.3.7
      - packaging==21.3
      - pluggy==1.0.0
      - py==1.11.0
      - pyparsing==3.1.4
      - pyrsistent==0.18.0
      - pytest==7.0.1
      - pytest-mock==3.6.1
      - six==1.17.0
      - tomli==1.2.3
      - typing-extensions==4.1.1
      - zipp==3.6.0
prefix: /opt/conda/envs/python-jsonschema-objects

test/test_regression_165.py::test_extra_properties_can_be_deleted_with_attribute_syntax test/test_regression_165.py::test_extra_properties_can_be_deleted_directly test/test_regression_165.py::test_real_properties_arent_really_deleted
test/test_regression_156.py::test_regression_156 test/test_regression_165.py::test_extra_properties_can_be_deleted_with_item_syntax
python_jsonschema_objects/classbuilder.py python_jsonschema_objects/descriptors.py
python_jsonschema_objects/classbuilder.py python_jsonschema_objects/descriptors.py