2025-09-10:仓库迁移
This commit is contained in:
59
8.类与对象/11.简化数据结构的初始化过程.py
Normal file
59
8.类与对象/11.简化数据结构的初始化过程.py
Normal file
@@ -0,0 +1,59 @@
|
||||
# 有时候你编写了一堆类当数据结构用,但是懒得写一堆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)
|
||||
|
Reference in New Issue
Block a user