概述
__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 Python 笔记四所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复