|
38 | 38 | # SOFTWARE.
|
39 | 39 |
|
40 | 40 |
|
| 41 | +def _f(): pass |
| 42 | +FunctionType = type(_f) |
| 43 | +descriptor = type(FunctionType.__code__) |
| 44 | + |
| 45 | + |
41 | 46 | class property(object):
|
42 | 47 | """
|
43 | 48 | property(fget=None, fset=None, fdel=None, doc=None) -> property attribute
|
@@ -72,6 +77,15 @@ def __init__(self, fget=None, fset=None, fdel=None, doc=None, name=None):
|
72 | 77 | self.fset = fset
|
73 | 78 | self.fdel = fdel
|
74 | 79 | self.doc = doc
|
| 80 | + self.getter_doc = False |
| 81 | + if self.doc is None and fget: |
| 82 | + gdoc = getattr(fget, "__doc__") |
| 83 | + if gdoc: |
| 84 | + if type(self) is property: |
| 85 | + self.doc = gdoc |
| 86 | + else: |
| 87 | + self.__doc__ = gdoc |
| 88 | + self.getter_doc = True |
75 | 89 | self.name = name
|
76 | 90 | self._owner = None
|
77 | 91 |
|
@@ -117,4 +131,26 @@ def __copy(self, fget=None, fset=None, fdel=None):
|
117 | 131 | _fget = fget if fget is not None else self.fget
|
118 | 132 | _fset = fset if fset is not None else self.fset
|
119 | 133 | _fdel = fdel if fdel is not None else self.fdel
|
120 |
| - return type(self)(fget=_fget, fset=_fset, fdel=_fdel, doc=self.doc, name=self.name) |
| 134 | + _doc = None if (self.getter_doc and _fget) else self.doc |
| 135 | + return type(self)(fget=_fget, fset=_fset, fdel=_fdel, doc=_doc, name=self.name) |
| 136 | + |
| 137 | + |
| 138 | +def isabstract(self): |
| 139 | + return (bool(getattr(self.fget, "__isabstractmethod__", False)) or |
| 140 | + bool(getattr(self.fset, "__isabstractmethod__", False)) or |
| 141 | + bool(getattr(self.fdel, "__isabstractmethod__", False))) |
| 142 | + |
| 143 | + |
| 144 | +property.__isabstractmethod__ = descriptor(fget=isabstract, name="__isabstractmethod__", owner=property) |
| 145 | + |
| 146 | + |
| 147 | +def get_doc(self): |
| 148 | + return self.doc |
| 149 | + |
| 150 | + |
| 151 | +def set_doc(self, value): |
| 152 | + self.doc = value |
| 153 | + self.getter_doc = False |
| 154 | + |
| 155 | + |
| 156 | +property.__doc__ = descriptor(fget=get_doc, fset=set_doc, name="__doc__", owner=property) |
0 commit comments