属性:@property:将方法伪装成属性,为了更合理.
应用于:类似BMI、面积这种看着像名词,但实际需要通过计算的
属性的改值:@属性化的方法名.setter(@age.setter),当对属性化的方法名改值的时候(p1.age = 26)触发执行
(知道就行了)属性的删除:@属性化的方法名.deleter,当见到del p1.age这个指令时触发执行
特殊方法(内置方法/<br>魔术方法/双下方法)
__new__:构造方法 开辟内存空间,产生并返回对象,通过类名+()触发
在什么时候执行呢?<br>在实例化过程中,在__init__之前执行<br>执行new 和 init的整个过程就是实例化过程
面试题:写一个单例类****
__init__:初始化方法,此方法主要是给对象封装属性
__call__方法:通过实例化的对象()触发.<br>用类写装饰器的时候必用
__item__系列:<br># 和对象使用[]访问值有联系<br># 在内置模块中,有一些特殊的方法,要求<br>对象必须实现getitem/setitem才能实现<br>
__getitem__:obj['name'] 就会触发__getitem__方法,并将'name'传入此方法中
__setitem__
obj['name'] = 'alex' 就会触发
__delitem__
del obj['name'] 就会触发
__len__方法:len(对象) 触发
要求这个方法的返回值必须是int类型
__hash__方法: hash(对象) 触发
hash是一个算法,能够把某一个要存在内存里的值通过一系列计算,保证不同值的hash结果是不一样的
对同一个值在多次执行python代码的时候hash值是不同。但是对同一个值 在同一次执行python代码的时候hash值永远不变
__str__方法:print(对象)或者str(对象)或者格式化输出'%s' % 对象 触发
要求这个方法的返回值必须是str类型
__repr__方法:保持原型 repr(对象)或者格式化输出'%r' % 对象 触发
是__str__的备胎.<br>如果有__str__方法,那么 print()、%s、str()都先去执行__str__方法,并且使用__str__的返回值<br>当没有__str__时,print()、%s、str()也会触发__repr__方法
# 在子类中使用__str__,先找子类的__str__,没有的话要向上找,只要父类不是object,就执行父类的__str__<br><br># 但是如果出了object之外的父类都没有__str__方法,就执行子类的__repr__方法,如果子类也没有,<br><br># 还要向上继续找父类中的__repr__方法.<br><br># 一直找不到 再执行object类中的__str__方法
要求这个方法的返回值必须是str类型
__del__方法:析构方法 del 对象 触发 或者 代码块执行完(或者大型代码执行中途清理<br>不需要的对象空间),python解释器回收机制回收这个对象所占内存的时候自动触发
应用:去归还或者释放在创建对象的时候借用的一些资源(例如文件、网络链接等)
__eq__方法:对象 == 对象 或者set去重时,某几个元素hash值相同后 触发
上下文管理器相关,对一个对象进行with操作时触发这两个方法
__enter__方法
__exit__方法
类方法
@classmethod(cls): 通过类名调用的方法,他会将类空间传给cls<br> #对象调用类方法,传给cls的也是对象的所属类的类空间
类方法的作用:就是想要类名调用,去操控这个公共模板的内容(属性,方法等)
应用场景:
1.类中,有些方法无需对象参与,是不需要传入对象的
2.对类的静态变量进行改变(通过对象只能查询、调用类中的静态变量,而没有增删改等其他操作)
3.(常用)继承中,父类获取子类的类空间 (子类通过类名执行父类的类方法,并将类名空间传给父类),这样就可以对子类的类空间中的所有内容为所欲为。(而另一种方法,通过实例化一个对象之后执行父类中的方法,来访问子类中的值,就只能查询,不能别的修改等)
静态方法
@staticmethod():不用传入类空间,对象空间的方法
存在意义:
1.代码块的整体性,将函数分类,清晰
2.复用性