@@ -1013,17 +1013,23 @@ here is a pure Python equivalent:
1013
1013
if obj is None:
1014
1014
return self
1015
1015
if self.fget is None:
1016
- raise AttributeError(f"property '{self._name}' has no getter")
1016
+ raise AttributeError(
1017
+ f'property {self._name!r} of {type(obj).__name__!r} object has no getter'
1018
+ )
1017
1019
return self.fget(obj)
1018
1020
1019
1021
def __set__(self, obj, value):
1020
1022
if self.fset is None:
1021
- raise AttributeError(f"property '{self._name}' has no setter")
1023
+ raise AttributeError(
1024
+ f'property {self._name!r} of {type(obj).__name__!r} object has no setter'
1025
+ )
1022
1026
self.fset(obj, value)
1023
1027
1024
1028
def __delete__(self, obj):
1025
1029
if self.fdel is None:
1026
- raise AttributeError(f"property '{self._name}' has no deleter")
1030
+ raise AttributeError(
1031
+ f'property {self._name!r} of {type(obj).__name__!r} object has no deleter'
1032
+ )
1027
1033
self.fdel(obj)
1028
1034
1029
1035
def getter(self, fget):
@@ -1054,6 +1060,11 @@ here is a pure Python equivalent:
1054
1060
def delx(self):
1055
1061
del self.__x
1056
1062
x = Property(getx, setx, delx, "I'm the 'x' property.")
1063
+ no_getter = Property(None, setx, delx, "I'm the 'x' property.")
1064
+ no_setter = Property(getx, None, delx, "I'm the 'x' property.")
1065
+ no_deleter = Property(getx, setx, None, "I'm the 'x' property.")
1066
+ no_doc = Property(getx, setx, delx, None)
1067
+
1057
1068
1058
1069
# Now do it again but use the decorator style
1059
1070
@@ -1092,6 +1103,32 @@ here is a pure Python equivalent:
1092
1103
>>> hasattr (ccc, ' x' )
1093
1104
False
1094
1105
1106
+ >>> cc = CC()
1107
+ >>> cc.x = 33
1108
+ >>> try :
1109
+ ... cc.no_getter
1110
+ ... except AttributeError as e:
1111
+ ... e.args[0 ]
1112
+ ...
1113
+ "property 'no_getter' of 'CC' object has no getter"
1114
+
1115
+ >>> try :
1116
+ ... cc.no_setter = 33
1117
+ ... except AttributeError as e:
1118
+ ... e.args[0 ]
1119
+ ...
1120
+ "property 'no_setter' of 'CC' object has no setter"
1121
+
1122
+ >>> try :
1123
+ ... del cc.no_deleter
1124
+ ... except AttributeError as e:
1125
+ ... e.args[0 ]
1126
+ ...
1127
+ "property 'no_deleter' of 'CC' object has no deleter"
1128
+
1129
+ >>> CC .no_doc.__doc__ is None
1130
+ True
1131
+
1095
1132
The :func: `property ` builtin helps whenever a user interface has granted
1096
1133
attribute access and then subsequent changes require the intervention of a
1097
1134
method.
0 commit comments