美文网首页
Python 简化数据结构的初始化

Python 简化数据结构的初始化

作者: noteby | 来源:发表于2018-11-29 19:08 被阅读0次

    写了很多仅仅用作数据结构的类,不想写太多烦人的 init() 函数,可以在一个基类中写一个公用的 init() 函数,如下:

    import math
    
    class Structure1:
        # Class variable that specifies expected fields
        _fields = []
    
        def __init__(self, *args):
            if len(args) != len(self._fields):
                raise TypeError('Expected {} arguments'.format(len(self._fields)))
            # Set the arguments
            for name, value in zip(self._fields, args):
                setattr(self, name, value)
    
    class Stock(Structure1):
        _fields = ['name', 'shares', 'price']
    
    class Point(Structure1):
        _fields = ['x', 'y']
    
    class Circle(Structure1):
        _fields = ['radius']
    
        def area(self):
            return math.pi * self.radius ** 2
    

    如果还想支持关键字参数,可以将关键字参数设置为实例属性:

    class Structure2:
        _fields = []
    
        def __init__(self, *args, **kwargs):
            if len(args) > len(self._fields):
                raise TypeError('Expected {} arguments'.format(len(self._fields)))
    
            # Set all of the positional arguments
            for name, value in zip(self._fields, args):
                setattr(self, name, value)
    
            # Set the remaining keyword arguments
            for name in self._fields[len(args):]:
                setattr(self, name, kwargs.pop(name))
    
            # Check for any remaining unknown arguments
            if kwargs:
                raise TypeError('Invalid argument(s): {}'.format(','.join(kwargs)))
    # Example use
    if __name__ == '__main__':
        class Stock(Structure2):
            _fields = ['name', 'shares', 'price']
    
        s1 = Stock('ACME', 50, 91.1)
        s2 = Stock('ACME', 50, price=91.1)
        s3 = Stock('ACME', shares=50, price=91.1)
        # s3 = Stock('ACME', shares=50, price=91.1, aa=1)
    

    还能将不在 _fields 中的名称加入到属性中去:

    class Structure3:
        # Class variable that specifies expected fields
        _fields = []
    
        def __init__(self, *args, **kwargs):
            if len(args) != len(self._fields):
                raise TypeError('Expected {} arguments'.format(len(self._fields)))
    
            # Set the arguments
            for name, value in zip(self._fields, args):
                setattr(self, name, value)
    
            # Set the additional arguments (if any)
            extra_args = kwargs.keys() - self._fields
            for name in extra_args:
                setattr(self, name, kwargs.pop(name))
    
            if kwargs:
                raise TypeError('Duplicate values for {}'.format(','.join(kwargs)))
    
    # Example use
    if __name__ == '__main__':
        class Stock(Structure3):
            _fields = ['name', 'shares', 'price']
    
        s1 = Stock('ACME', 50, 91.1)
        s2 = Stock('ACME', 50, 91.1, date='8/2/2012')
    

    相关文章

      网友评论

          本文标题:Python 简化数据结构的初始化

          本文链接:https://www.haomeiwen.com/subject/ctxqcqtx.html