class classproperty(property):
def __get__(self, owner_self, owner_cls):
return self.fget(owner_cls)
class CMeta(type):
def __setattr__(cls, name, value):
if isinstance(vars(cls).get(name), classproperty):
raise AttributeError("can't set attribute")
super().__setattr__(name, value)
class C(metaclass=CMeta):
@classproperty
def x(cls):
return 1
print(C.x)
print(C().x)
C.x = 2 # AttributeError: can't set attribute
Y2xhc3MgY2xhc3Nwcm9wZXJ0eShwcm9wZXJ0eSk6CiAgICBkZWYgX19nZXRfXyhzZWxmLCBvd25lcl9zZWxmLCBvd25lcl9jbHMpOgogICAgICAgIHJldHVybiBzZWxmLmZnZXQob3duZXJfY2xzKQoKY2xhc3MgQ01ldGEodHlwZSk6CiAgICBkZWYgX19zZXRhdHRyX18oY2xzLCBuYW1lLCB2YWx1ZSk6CiAgICAgICAgaWYgaXNpbnN0YW5jZSh2YXJzKGNscykuZ2V0KG5hbWUpLCBjbGFzc3Byb3BlcnR5KToKICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IoImNhbid0IHNldCBhdHRyaWJ1dGUiKQogICAgICAgIHN1cGVyKCkuX19zZXRhdHRyX18obmFtZSwgdmFsdWUpCgpjbGFzcyBDKG1ldGFjbGFzcz1DTWV0YSk6CiAgICBAY2xhc3Nwcm9wZXJ0eQogICAgZGVmIHgoY2xzKToKICAgICAgICByZXR1cm4gMQoKcHJpbnQoQy54KQpwcmludChDKCkueCkKQy54ID0gMiAjIEF0dHJpYnV0ZUVycm9yOiBjYW4ndCBzZXQgYXR0cmlidXRl