Guest User

Untitled

a guest
Feb 15th, 2019
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.65 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # -*- encoding: utf-8 -*-
  3. """
  4. filename: descriptor_1_2.py
  5. description: python descriptor
  6. License: GPL V2
  7. Author: 天使de眼睛
  8.  
  9. 除特别声明,所有代码均是 python3.6 在 iOS 环境下编写测试。
  10.  
  11. 运行代码需要 pytest
  12. pip install pytest
  13. """
  14. from ipaddress import ip_address
  15.  
  16. import pytest
  17.  
  18.  
  19. class Descriptor:
  20. def __init__(self, name):
  21. self.name = name
  22.  
  23. def __get__(self, instance, cls):
  24. return instance.__dict__[self.name]
  25.  
  26. def __set__(self, instance, value):
  27. instance.__dict__[self.name] = value
  28.  
  29.  
  30. class TypeCheck(Descriptor):
  31. obj_type = object
  32.  
  33. def __set__(self, instance, value):
  34. if not isinstance(value, self.obj_type):
  35. raise TypeError(f"Expected {self.obj_type}")
  36. super().__set__(instance, value)
  37.  
  38.  
  39. class String(TypeCheck):
  40. obj_type = str
  41.  
  42.  
  43. class Upper(Descriptor):
  44. def __set__(self, instance, value):
  45. super().__set__(instance, value.upper())
  46.  
  47.  
  48. class UpperString(String, Upper):
  49. pass
  50.  
  51.  
  52. class IPAddress(Descriptor):
  53. def __set__(self, instance, value):
  54. super().__set__(instance, ip_address(value))
  55.  
  56. class IP(String, IPAddress):
  57. pass
  58.  
  59.  
  60. class Server:
  61. name = UpperString("name")
  62. ip = IP("ip")
  63.  
  64. def __init__(self, name, ip):
  65. self.name = name
  66. self.ip = ip
  67.  
  68.  
  69. class Protocol:
  70. protocol = UpperString("protocol")
  71. source = IP("source")
  72. destination = IP("destination")
  73.  
  74. def __init__(self, protocol, source, destinatioin):
  75. self.protocol = protocol
  76. self.source = source
  77. self.destination = destinatioin
  78.  
  79.  
  80. class TestClasses:
  81. def test_Server(self):
  82. server = Server('myserver1', '192.168.1.1')
  83. assert server.name == 'MYSERVER1'
  84. assert server.ip == ip_address('192.168.1.1')
  85. with pytest.raises(TypeError) as error:
  86. server.name = 123
  87. assert str(error.value) == "Expected <class 'str'>"
  88. with pytest.raises(TypeError) as error:
  89. server.ip = 123
  90. assert str(error.value) == "Expected <class 'str'>"
  91.  
  92. def test_Protocol(self):
  93. logger = Protocol('tcp', '192.168.1.1', '10.1.1.1')
  94. assert logger.protocol == 'TCP'
  95. assert logger.source == ip_address('192.168.1.1')
  96. assert logger.destination == ip_address('10.1.1.1')
  97. with pytest.raises(TypeError) as error:
  98. logger.protocol = ['tcp']
  99. assert str(error.value) == "Expected <class 'str'>"
  100. with pytest.raises(TypeError) as error:
  101. logger.source = 55
  102. assert str(error.value) == "Expected <class 'str'>"
  103.  
  104.  
  105.  
  106. if __name__ == '__main__':
  107. import sys
  108.  
  109. pytest.main(sys.argv + ['-v'])
Add Comment
Please, Sign In to add comment