Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python
- # -*- encoding: utf-8 -*-
- """
- filename: descriptor_1_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 Server:
- name = UpperString("name")
- ip = IP("ip")
- def __init__(self, name, ip):
- self.name = name
- self.ip = ip
- class Protocol:
- protocol = UpperString("protocol")
- source = IP("source")
- destination = IP("destination")
- def __init__(self, protocol, source, destinatioin):
- self.protocol = protocol
- self.source = source
- self.destination = destinatioin
- class TestClasses:
- def test_Server(self):
- server = Server('myserver1', '192.168.1.1')
- 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'>"
- def test_Protocol(self):
- logger = Protocol('tcp', '192.168.1.1', '10.1.1.1')
- 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'>"
- if __name__ == '__main__':
- import sys
- pytest.main(sys.argv + ['-v'])
Add Comment
Please, Sign In to add comment