Python__new__方法、定制属性访问、描述符与装饰器

  1. __new__方法的运行顺序
  2. 装饰器的概念的用法
  3. 三个内置装饰器
  4. 类中属性的访问过程

__new__方法

创建实例的方法

__new__方法是在类创建实例的时候自动调用的

实例是通过类里面的__new__方法创建出来的

先调用__new__方法创建实例,再调用 __init__方法初始化实例

__new__方法,后面括号里的cls代表的是类本身

必须有返回值 父类名.__new__(cls)

单例模式

创建多个实例的时候,每个实例所指向的内存地址不同

单例模式让多个实例引用的是同一个实例,是一个实例的不同名字,指向同一内存地址

定制属性访问

就是对类里的属性进行增删改查的操作

实例名.属性名=值

setattr(实例名, ‘属性名‘, 值)        # 有这个属性就修改,没有就增加

实例名.__setattr__(‘属性名‘,值)       # 有这个属性就修改,没有就增加

只能删除自己添加的属性

delattr(实例名, ‘属性名‘)

实例名.__delattr__(‘属性名‘)

del 实例名

setattr(实例名, ‘属性名‘, 值)        # 有这个属性就修改,没有就增加

实例名.__setattr__(‘属性名‘,值)       # 有这个属性就修改,没有就增加

hasattr(实例名, ‘属性名‘)      返回bool值

getattr(实例名,  ‘属性名‘)      返回属性值,不存在则报错

实例名. __getattribute__(‘属性名‘)  返回属性值,不存在则报错

描述符

比较抽象的一个概念,了解即可

描述符协议:python描述符是一个“绑定行为”的对象属性,在描述符协议中,它可以通过方法重写属性的访问

这些方法有 __get__(), __set__(), 和__delete__()

如果这些方法中的任何一个被定义在一个对象中,这个对象就是一个描述符

装饰器

本质是函数,能够实现在不修改原来的函数的基础上添加功能

在闭包的前提下进行装饰

三个内置装饰器

@property       # 就像和访问属性一样

@staticmethod     # 静态方法,与class类断开连接

@classmethod     # 类方法  cls代表类本身

类装饰器

类也可以做装饰器,但是需要定义 __call__ 方法

原文地址:https://www.cnblogs.com/jiyu-hlzy/p/11762128.html

时间: 2024-10-03 22:34:41

Python__new__方法、定制属性访问、描述符与装饰器的相关文章

Python笔记(4)类(上)属性与描述符

部分参考自:http://www.geekfan.net/7862/ 新式类与经典类 2和3不一样,3都是新式类. 新式类和经典类的区别: class A: #classic class """this is class A""" pass __slots__=('x','y') def test(self): # classic class test """this is A.test()""&

ie8 报错:意外地调用了方法或属性访问

在某场景中一句简单的js: $("#changeOption").text("增加"); 在 IE8 下面报错:'意外地调用了方法或属性访问' 改成:$("#changeOption").html("增加"); 报同样的错. 改成:document.getElementById('changeOption').innerText="增加"; 同样报错:"未知的运行时错误" 最后改成:$(

魔法方法:属性访问

__getattr__(self,name) 当用户试图访问name,而name属性不存在时就会调用getattr __getattribute__(self,name) 当用户试图访问name时就会调用getattribute __setattr__(self,name,value)当name被设置为value的时候就会调用setattr __delattr__(self,name)当name属性被删除时就会调用delattr 只有重写以上四个魔法方法,就可以改变属性访问

Python3 魔法方法:属性访问

1.与属性访问有关的魔法方法 __getattr__(self,name) 定义当用户试图获取某一不存在的属性时的行为 __getattribute__(self,name) 定义当该类属性被访问时的行为 __setattr__(self,name,value) 定义一个属性被设置时的行为 __delattr__(self,name) 定义一个属性被删除时的行为 注意: def __setattr__(self, name, value): self.name = value + 1 #此代码试

python staticmethod,classmethod方法的使用和区别以及property装饰器的作用

class Kls(object): def __init__(self, data): self.data = data def printd(self): print(self.data) @staticmethod def smethod(*arg): print('Static:', arg) @classmethod def cmethod(*arg): print('Class:', arg) >>> ik = Kls(23) >>> ik.printd()

属性访问修饰符

作用:限定属性可以被访问的范围.注意:是用来修饰属性的,不是用来修饰方法的. 分类:@private  @protected  @package  @public. 1.@private 被private修饰的属性,叫私有属性,只能在本类中访问.除了这个类的内部,其他地方都无权访问. 2.@protected 3.@package 4.@public

【Python045-魔法方法:属性访问】

一.属性的几种访问方式 1.类.属性名 >>> class C: def __init__(self): self.x = 'X-man' >>> c = C() >>> c.x 'X-man' 2.用内置函数getattr()访问属性 >>> getattr(c,'x','莫有这个属性') 'X-man' >>> getattr(c,'y','莫有这个属性') '莫有这个属性' >>> 3.用pr

神奇的描述符(二):使用描述符实现实例属性的类型检查

因为描述符本身可以接管实例属性的访问,利用这个特点,可以使用描述符来实现一些实例属性的类型检查工作. 先定义一个描述符 Point,用于管理坐标信息. class Point: def __init__(self, name): self.name = name def __get__(self, instance, owner): # 通常情况下,通过类属性访问描述符时,返回描述符自身 if instance is None: return self # 通过实例属性访问描述符时,返回实例 e

通过描述符自定制@property的功能

# 通过描述符自定制@property的功能 # 原始通过@property实现的功能:将类中定义的函数属性,通过装饰器@property将其封闭成数据属性 class Room: def __init__(self, name, width, length): self.name = name self.width = width self.length = length @property def area(self): return self.width * self.length r1