简化数据结构的初始化
- 1、不想写太多烦人的
__init __()
函数,可以在一个基类中写一个公用的__init__()
函数
# -*- coding: utf-8 -*-
import math
class Structure1(object):
_fields = []
def __init__(self, *args):
if len(args) != len(self._fields):
raise TypeError("Expected {} arguments".format(len(self._fields)))
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
s = Stock("ACME", 50, 91.1)
p = Point(3, 5)
c = Circle(4.5)
print(s.__dict__)
print(p.__dict__)
print(c.__dict__)
运行结果:
{'name': 'ACME', 'shares': 50, 'price': 91.1}
{'x': 3, 'y': 5}
{'radius': 4.5}
- 2、还能将不在fields 中的名称加入到属性中去
# -*- coding: utf-8 -*-
class Structure2(object):
_fields = []
def __init__(self,*args,**kwargs):
if len(args) != len(self._fields):
raise TypeError("Expected {} arguments".format(len(self._fields)))
for name,value in zip(self._fields,args):
setattr(self,name,value)
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)))
class Stock(Structure2):
_fields = ["name","shares","price"]
if __name__ == '__main__':
s1 = Stock("ACME",50,91.1)
s2 = Stock("ACME",50,91.1,date="2018/01/08")
print(s1.__dict__)
print(s2.__dict__)
运行结果:
{'name': 'ACME', 'shares': 50, 'price': 91.1}
{'name': 'ACME', 'shares': 50, 'price': 91.1, 'date': '2018/01/08'}
当需要使用大量很小的数据结构类的时候,相比手工一个个定义__init__()
方法,使用这种方式可以大大简化代码
详情可以参考《Python Cookbook》第三版第八章