Skip to content

Instantly share code, notes, and snippets.

@cppio
Last active October 18, 2025 13:14
Show Gist options
  • Select an option

  • Save cppio/a80c22887a64647efd8590d8b50f6e66 to your computer and use it in GitHub Desktop.

Select an option

Save cppio/a80c22887a64647efd8590d8b50f6e66 to your computer and use it in GitHub Desktop.
Python descriptors
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