__getattr__- 利用
__new__创建对象 - @property和@name.setter
- 相当于name = property(fget, fset, fdel, doc)
- 新添的property类特性能够遮盖实例属性
- 实例属性不会遮盖类特性
利用property(fget, fset, fdel, doc)创建类特性工厂函数(改用描述符类更简洁易于扩展和继承)
def quantity(name): def fget(instance): return instance.__dict__[name] def fset(instance, value): if value > 0: instance.__dict__[name] = value # 跳过特性 else: raise ValueError('%s must > 0' % name) return property(fget, fset)Python looks for special methods such as
__getattr__only in an object’s class, and not in the instances themselves.?????????__getattr__、__getattribute__、__delattr__、__setattr____new__看作创建类的工厂方法(生成不同类型的对象或者返回事先生成好的对象)。- 描述符
__get__、__set__、__del__ __set__(self, instance, value)self指描述符类实例,instance指托管类实例__get__(self, instance, owner)在owner为托管类类,当owner为空时(即类.属性时),返回描述符类本身self。- 模板方法设计模式:抽象类:模板方法和抽象方法,其中模板方法中调用抽象方法获取结果,并实现其他相同业务。;实现类:实现抽象方法。23种设计模式(6):模版方法模式
- 覆盖型描述符(定义
__set__)和非覆盖型描述符(无__set__) - 覆盖型描述符(实现
__get__和`__set__):实例和类的获取值和属性赋值操作都会触发这两个方法,不会被实例属性覆盖。 - 未实现
__get__的覆盖型描述符:赋值触发__set__,但获取属性或被实例属性遮盖。 - 非覆盖性描述符(未实现
__set__): - 任何描述符都可以通过类属性来覆盖。
- 方法是非覆盖性描述符。
- 函数function变成绑定方法bound method,bound method有
__self__属性,是调用这个方法的实例的引用;__func__属性是在托管类上的原始函数的引用;还有__call__方法,来调用__func__。 - 类装饰器可能对子类无效。
- type是其自身的实例,object是type的实例,type是object的子类。
- 类都是object的子类,类都是type的实例
最后
以上就是乐观鸡最近收集整理的关于Fluent Python 笔记四的全部内容,更多相关Fluent内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复