class MyClass(object, metaclass=class_property.metaclass()):
        _value = None

        @class_property
        def value(self):
            return MyClass._value

        @value.setter
        def value(self, val):
            MyClass._value = val
    class MyClass(object, metaclass=class_property.metaclass()):
        _VALUE = None

        @class_property
        def value(self):
            return MyClass._VALUE

        @value.setter
        def value(self, value):
            MyClass._VALUE = value
    class SubClass(MyClass, metaclass=class_property.metaclass(MyClass)):
        _VALUE2 = 2

        # Because we have a different metaclass `SubClass.value` is different from `MyClass.value`
        @class_property
        def value():
            return SubClass._VALUE2

        @value.setter
        def value(val):
            SubClass._VALUE2 = val
    class SubClass(MyClass, metaclass=class_property.metaclass(MyClass)):
        _VALUE = None

        # This replaces "MyClass.value". class_value/class_property uses the metaclass, so we have to replace.
        # We can only change to a new object if we change the metaclass.
        @class_property
        def value(self):
            return SubClass._VALUE

        @value.setter
        def value(self, val):
            SubClass._VALUE = val