Guest User

Untitled

a guest
Feb 16th, 2019
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.05 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # -*- encoding: utf-8 -*-
  3. """
  4. filename: descriptor_2_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. class Integer(TypeCheck):
  60. obj_type = int
  61.  
  62. class Greater(Descriptor):
  63. def __init__(self, *args, greater=None, **kwargs):
  64. self.greater = greater
  65. super().__init__(*args, **kwargs)
  66.  
  67. def __set__(self, instance, value):
  68. if value < (self.greater or value):
  69. raise ValueError(f'{self.name} must >= {self.greater}')
  70. super().__set__(instance, value)
  71.  
  72. class Less(Descriptor):
  73. def __init__(self, *args, less=None, **kwargs):
  74. self.less = less
  75. super().__init__(*args, **kwargs)
  76.  
  77. def __set__(self, instance, value):
  78. if value > (self.less or value):
  79. raise ValueError(f'{self.name} must <= {self.less}')
  80. super().__set__(instance, value)
  81.  
  82. class Port(Integer, Greater, Less):
  83. pass
  84.  
  85. class Server:
  86. name = UpperString("name")
  87. ip = IP("ip")
  88. rack = Integer('rack')
  89.  
  90. def __init__(self, name, ip, rack):
  91. self.name = name
  92. self.ip = ip
  93. self.rack = rack
  94.  
  95.  
  96. class Protocol:
  97. protocol = UpperString("protocol")
  98. source = IP("source")
  99. destination = IP("destination")
  100. port = Port("port", greater=1, less=65535)
  101.  
  102. def __init__(self, protocol, source, destinatioin, port):
  103. self.protocol = protocol
  104. self.source = source
  105. self.destination = destinatioin
  106. self.port = port
  107.  
  108.  
  109. class TestClasses:
  110. def test_Server(self):
  111. server = Server('myserver1', '192.168.1.1', 5)
  112. assert server.name == 'MYSERVER1'
  113. assert server.ip == ip_address('192.168.1.1')
  114. with pytest.raises(TypeError) as error:
  115. server.name = 123
  116. assert str(error.value) == "Expected <class 'str'>"
  117. with pytest.raises(TypeError) as error:
  118. server.ip = 123
  119. assert str(error.value) == "Expected <class 'str'>"
  120. assert server.rack == 5
  121. with pytest.raises(TypeError) as error:
  122. server.rack = 'up'
  123. assert str(error.value) == "Expected <class 'int'>"
  124.  
  125. def test_Protocol(self):
  126. logger = Protocol('tcp', '192.168.1.1', '10.1.1.1', 8080)
  127. assert logger.protocol == 'TCP'
  128. assert logger.source == ip_address('192.168.1.1')
  129. assert logger.destination == ip_address('10.1.1.1')
  130. with pytest.raises(TypeError) as error:
  131. logger.protocol = ['tcp']
  132. assert str(error.value) == "Expected <class 'str'>"
  133. with pytest.raises(TypeError) as error:
  134. logger.source = 55
  135. assert str(error.value) == "Expected <class 'str'>"
  136. assert logger.port == 8080
  137. with pytest.raises(ValueError) as error:
  138. logger.port = 0
  139. assert str(error.value) == "port must >= 1"
  140. with pytest.raises(ValueError) as error:
  141. logger.port = 65536
  142. assert str(error.value) == "port must <= 65535"
  143.  
  144.  
  145.  
  146. if __name__ == '__main__':
  147. import sys
  148.  
  149. pytest.main(sys.argv + ['-v'])
Add Comment
Please, Sign In to add comment