# 有时候你编写了一堆类当数据结构用,但是懒得写一堆init函数,这时候可以将初始化数据结构的init函数归纳到一个公共基类中 class Structure: _fields = [] def __init__(self, *args, **kwargs): if len(args) > len(self._fields): raise TypeError("Expect {} arguments, but only {}".format(len(self._fields), len(args))) # 处理顺序输入的参数 for name, value in zip(self._fields, args): setattr(self, name, value) # 处理关键字参数 for name in args[len(self._fields):]: setattr(self, name, kwargs.pop(name)) # 处理多余的关键字参数 if kwargs: raise TypeError("Invalid arguments {}".format(",".join(kwargs))) class lazy: def __init__(self, func): self.func = func def __get__(self, instance, cls): if instance is None: return self else: value = self.func(instance) setattr(instance, self.func.__name__, value) return value # 这时候我们会发现你只需要指定参数就行了,异常的好使 import math if __name__ == '__main__': class Stock(Structure): _fields = ["name", "shares", "price"] __slots__ = _fields class Points(Structure): _fields = ["x", "y"] __slots__ = _fields class Circle(Structure): _fields = ["radius"] __slots__ = _fields @lazy def area(self): return math.pi * self.radius ** 2 s = Stock('ACME', 50, 91.1) p = Points(2,3) c = Circle(4.5) print(c.area) print(c.area)