Python元类编程(高级编程四)

####getattrgetattribute魔法函数
__getattr__
此方法仅当属性不能在实例的dict或其父类的 dict中找到时,才被调用

Tip:item为查询的属性字符串
__getattribute__
当实现了__getattribute__后,当属性不能在实例的dict或其父类的 dict中找到时,会先去查找__getattribute__
一般时候不会去实现该方法,当实现该方法后,不会去查询__getattr__方法。


属性描述符

  • 首先需要知道@property的用法

@property装饰器就是负责把一个方法变成属性调用.

多个属性都需要判断,那么就需要写多个方法,所以就会用到属性描述符,property 其实是一种属性描述符
– 属性描述符:只要实现了__get__,__set__,__delete__任何一个方法,就被称为属性描述符

这样就可以批量生成属性并且不用重复判断,并且描述符类能够继承


属性查找顺序

  • 当获取类实例化的属性时,查找顺序
    Person().name
  1. 如果name出现在类或其基类的__dict__中, 且name是data descriptor,那么调用其__get__方法
  2. 如果name出现在Person__dict__中, 那么直接返回obj.__dict__['name']
  3. 如果name出现在Person或其基类的__dict__
    • 如果name是non-data descriptor,那么调用其__get__方法
    • 返回__dict__['name']
  4. 如果Person__getattribute__方法,调用__getattribute__方法
  5. 如果Person__getattr__方法,调用__getattr__方法
  6. 抛出AttributeError

自定义元类

使用type创建动态类

type('object',(),{})

  • name:创建的类名称
  • bases:所继承的父类(Python支持多重继承,所以以元组形式)
  • dict:动态绑定属性和方法(__dict__)

动态创建支持继承父类的方法和属性


metaclass属性

  • 如果一个类中定义了metalass = xxx,Python就会用元类的方式来创建类

You May Also Like

Comments

Leave a Comment

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">