Last active
October 18, 2025 13:14
-
-
Save cppio/a80c22887a64647efd8590d8b50f6e66 to your computer and use it in GitHub Desktop.
Python descriptors
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import types | |
| class StaticMethod: | |
| def __init__(self, f): | |
| self.f = f | |
| def __get__(self, instance, owner): | |
| return self.f | |
| class ClassMethod: | |
| def __init__(self, f): | |
| self.f = f | |
| def __get__(self, instance, owner): | |
| return types.MethodType(self.f, owner) | |
| class InstanceMethod: | |
| def __init__(self, f): | |
| self.f = f | |
| def __get__(self, instance, owner): | |
| if instance is None: | |
| return self.f | |
| return types.MethodType(self.f, instance) | |
| class Property: | |
| def __init__(self, fget=None, fset=None, fdel=None): | |
| self.fget = fget | |
| self.fset = fset | |
| self.fdel = fdel | |
| def getter(self, fget): | |
| return Property(fget, self.fset, self.fdel) | |
| def setter(self, fset): | |
| return Property(self.fget, fset, self.fdel) | |
| def deleter(self, fdel): | |
| return Property(self.fget, self.fset, fdel) | |
| def __get__(self, instance, owner): | |
| if instance is None: | |
| return self | |
| return self.fget.__get__(instance, owner)() | |
| def __set__(self, instance, value): | |
| return self.fset.__get__(instance, type(instance))(value) | |
| def __delete__(self, instance): | |
| return self.fdel.__get__(instance, type(instance))() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment