类的名称获取 type(object).__name__
8.11 | 简化类的属性定义__init__ 如果有很多很多class需要定义 | 通过setattr来定义 |
8.17 | 创建一个实例,不用调用__init__,只调用__new__ 常在序列化json解析了一堆属性dict后使用 | @classmethod def today(cls): d= cls.__new__(cls) data = {"year":2022,"month":11,"day":3} for key,v in data: setattr(d,key,v) return d |
8.20 | 用字符名调用函数, 常在visitor模式中使用 | func = getattr(object, method_name) r = getattr(point, 'distance')(0,0) |
8.16 | 定义多个构造函数,使用classmethod classmethod的主要用途就是定义其他的构造函数 定义多个构造函数时,要注意,保持init简单,仅仅是对attribute进行赋值。其他的构造方法另外构造,不要在init写if, else | a= Date(2022,11,3) b= Data.today() 两种构造函数 @classmethod def today(cls): t = data_dict return cls(a,b,c) |
8.21 | 实现visitor模式 不同的对象有不同的操作 感觉有点像根据对象类型重载函数 add_int() add_float() 设计哲学:复杂的数据对象结构和操作逻辑解耦。这些方法不在原来的对象类实现 缺陷是不适合很深的嵌套 | class NodeVisitor: def visit(self,node): methname="visit_"+type(node).__name__ meth = getattr(self, methname) return meth(node) class Evaluator(NodeVisitor): def visit_Number(self,node) return node.value def visit_Add(self, node): return self.visit(node.left)+self.visit(node.right) |
8.1 | __repr__, __str__ | |
8.3 | with __enter__, __exit__ | |