Advertisement
Guest User

Untitled

a guest
Apr 18th, 2019
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.51 KB | None | 0 0
  1. import inspect
  2.  
  3. descriptor_records = []
  4.  
  5.  
  6. class Descriptor(object):
  7. def __init__(self, value=None):
  8. self.value = value
  9.  
  10. def __get__(self, instance, owner): # owner == instance.__class__
  11. descriptor_records.append(('get', instance, owner))
  12. return self.value
  13.  
  14. def __set__(self, instance, value):
  15. descriptor_records.append(('set', instance, value))
  16. self.value = value
  17.  
  18.  
  19. class Teddy:
  20. age = Descriptor(0)
  21.  
  22. def __init__(self):
  23. self.tall = Descriptor(100)
  24.  
  25.  
  26. teddy1 = Teddy()
  27. teddy2 = Teddy()
  28. assert 'tall' in teddy1.__dict__
  29. assert 'age' not in teddy1.__dict__
  30. assert 'age' in Teddy.__dict__
  31.  
  32. # instances share the same class property
  33. teddy1.age = 10
  34. assert descriptor_records.pop() == ('set', teddy1, 10)
  35. assert teddy1.age == 10
  36. assert descriptor_records.pop() == ('get', teddy1, Teddy)
  37. assert teddy2.age == 10
  38. assert descriptor_records.pop() == ('get', teddy2, Teddy)
  39.  
  40. # assign a descriptor to an instance is invalid
  41. assert type(teddy1.tall) == Descriptor
  42.  
  43. # access __dict__ cannot invoke the descriptor
  44. assert type(Teddy.__dict__['age']) == Descriptor
  45. assert len(descriptor_records) == 0
  46.  
  47. d1 = Descriptor()
  48. d2 = Descriptor()
  49. # instance method are the same obeject, but not equal
  50. assert d1.__set__ != d2.__set__
  51. assert id(d1.__set__) == id(d2.__set__)
  52. # instance method is "method", class method is "function"
  53. assert inspect.ismethod(d1.__set__)
  54. assert not inspect.isfunction(d1.__set__)
  55. assert not inspect.ismethod(Descriptor.__set__)
  56. assert inspect.isfunction(Descriptor.__set__)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement