Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python
- # -*- encoding: utf-8 -*-
- """
- filename: descriptor_2_2.py
- description: python descriptor
- License: GPL V2
- Author: 天使de眼睛
- 除特别声明,所有代码均是 python3.6 在 iOS 环境下编写测试。
- 运行代码需要 pytest
- pip install pytest
- """
- from ipaddress import ip_address
- import pytest
- class Descriptor:
- def __init__(self, name):
- self.name = name
- def __get__(self, instance, cls):
- return instance.__dict__[self.name]
- def __set__(self, instance, value):
- instance.__dict__[self.name] = value
- class TypeCheck(Descriptor):
- obj_type = object
- def __set__(self, instance, value):
- if not isinstance(value, self.obj_type):
- raise TypeError(f"Expected {self.obj_type}")
- super().__set__(instance, value)
- class String(TypeCheck):
- obj_type = str
- class Upper(Descriptor):
- def __set__(self, instance, value):
- super().__set__(instance, value.upper())
- class UpperString(String, Upper):
- pass
- class IPAddress(Descriptor):
- def __set__(self, instance, value):
- super().__set__(instance, ip_address(value))
- class IP(String, IPAddress):
- pass
- class Integer(TypeCheck):
- obj_type = int
- class Greater(Descriptor):
- def __init__(self, *args, greater=None, **kwargs):
- self.greater = greater
- super().__init__(*args, **kwargs)
- def __set__(self, instance, value):
- if value < (self.greater or value):
- raise ValueError(f'{self.name} must >= {self.greater}')
- super().__set__(instance, value)
- class Less(Descriptor):
- def __init__(self, *args, less=None, **kwargs):
- self.less = less
- super().__init__(*args, **kwargs)
- def __set__(self, instance, value):
- if value > (self.less or value):
- raise ValueError(f'{self.name} must <= {self.less}')
- super().__set__(instance, value)
- class Port(Integer, Greater, Less):
- pass
- class Server:
- name = UpperString("name")
- ip = IP("ip")
- rack = Integer('rack')
- def __init__(self, name, ip, rack):
- self.name = name
- self.ip = ip
- self.rack = rack
- class Protocol:
- protocol = UpperString("protocol")
- source = IP("source")
- destination = IP("destination")
- port = Port("port", greater=1, less=65535)
- def __init__(self, protocol, source, destinatioin, port):
- self.protocol = protocol
- self.source = source
- self.destination = destinatioin
- self.port = port
- class TestClasses:
- def test_Server(self):
- server = Server('myserver1', '192.168.1.1', 5)
- assert server.name == 'MYSERVER1'
- assert server.ip == ip_address('192.168.1.1')
- with pytest.raises(TypeError) as error:
- server.name = 123
- assert str(error.value) == "Expected <class 'str'>"
- with pytest.raises(TypeError) as error:
- server.ip = 123
- assert str(error.value) == "Expected <class 'str'>"
- assert server.rack == 5
- with pytest.raises(TypeError) as error:
- server.rack = 'up'
- assert str(error.value) == "Expected <class 'int'>"
- def test_Protocol(self):
- logger = Protocol('tcp', '192.168.1.1', '10.1.1.1', 8080)
- assert logger.protocol == 'TCP'
- assert logger.source == ip_address('192.168.1.1')
- assert logger.destination == ip_address('10.1.1.1')
- with pytest.raises(TypeError) as error:
- logger.protocol = ['tcp']
- assert str(error.value) == "Expected <class 'str'>"
- with pytest.raises(TypeError) as error:
- logger.source = 55
- assert str(error.value) == "Expected <class 'str'>"
- assert logger.port == 8080
- with pytest.raises(ValueError) as error:
- logger.port = 0
- assert str(error.value) == "port must >= 1"
- with pytest.raises(ValueError) as error:
- logger.port = 65536
- assert str(error.value) == "port must <= 65535"
- if __name__ == '__main__':
- import sys
- pytest.main(sys.argv + ['-v'])
Add Comment
Please, Sign In to add comment