python10.new方法、属性访问、描述符、装饰器

new:(给当前类创造一个内存空间,管理类的,实例通过他才能创建出来的,最先执行的方法)
比init执行更提前,cls是类本身,self是实例本身,init需要实例才能执行,调用new(return object.new(cls)),没有这个调用是不能创建实例执行init的
指向不同实例,每个对象的id都不会相同,单例模式下才会相同(只有一种实例化的模式)
因为init的self需要有实例所以不创建实例就无法执行,new(cls)有类就行,return object(可以用super()替代).new(cls)执行才能创建实例,同时也创建实例附属的内存地址
创建多个实例他们的内存地址都不相同.只有在单例模式下,实例化出来的多个对象才是相同的内存空间,
可用hasattr(方法,类似于函数)验证然后返回相同的属性return cls.xxxx(通过改变成属性相同,对应的对象也会变成相同的内存地址)

new一般用来创建单例模式用的

定制属性访问:(关于属性的增删改查)
实例.属性或方法直接调用,如果没有属性方法要提前的知道就需要用到查询的方法,
hasattr返回布尔值(调用时实例加属性中间要加逗号而不是’.‘),
getattr返回属性值(用法和hasattr相同),还有__getattribute__的魔法方法(调用方式实例.方法(属性))
def getattr(self,item),print。。。。。,用来定义在使用hasattr和getattr前面,
因为hasattr和getattr查询到目标会有东西返回,没有的话会报错,但是这里有提前定义的def __getattr__就不会报错而是会执行他的print还有return

修改
setattr(实例,属性,参数)有就改,无就增
实例.setattr(属性,参数),效果同上

del a直接删除一个对象,delattr(实例,属性)直接删除属性,实例.delattr(属性)直接删除属性

描述符:在一个类里面实例化另外一个类的实例化
一个类在另一个类里实例化成他的属性执行方式对应地执行对应的效果(类化为属性的一种定义来调用)
对应的有__get__(self,instance,owner)
set(self,instance,value)
delete(self,instance)
他们的print()有什么就反馈什么来进行描述

装饰器的本质是闭包
不仅函数可以当装饰器,类也可以
装饰器:
想要调用方法省略至直接输入子函数就执行一整套的话,可以在子函数前加@主函数名
常用的内置装饰器:@property(把方法当访问属性一样访问,分离方法与类,没有办法访问类里面的其他属性与方法,直接就是实例.方法名不用在后面再加括号),
@staticmethod,(静态方法装饰器,方法代码后的括号不用加self都能用,可以和class断开联系)
@classmethod(类方法装饰器,能把当前实例方法变成一个类方法,在方法括号里加cls,然后print(cls)能把实例方法变成类方法,并可以打印出类的内存地址
类的装饰器:
必须定义call方法,且call方法中加return self.实例的属性,来返回值
然后@一个类,后续与函数操作相似,不同的是self.属性后面可以加括号,加了可以调用被返回的实例不然不会执行他的命令

isinstance() 与 type() 区别:一个是查看类型一个是判断类型

type() 不会认为子类是一种父类类型,不考虑继承关系。type()是一个内建的函数,调用它就能够得到一个反回值,从而知道想要查询的对像类型信息

isinstance() 会认为子类是一种父类类型,考虑继承关系。判断一个对象是否是一个已知的类型
class A:
pass

class B(A):
pass

isinstance(A(), A) # returns True
type(A()) == A # returns True
isinstance(B(), A) # returns True
type(B()) == A # returns False

猜你喜欢

转载自blog.csdn.net/qwe863226687/article/details/113933931