复习day14
1.内置类属性
内置类属性 | 说明 |
---|---|
__dict__ | 类._dict_ 获取类中所有的字段, 对象.__dict__ 获取对象中所有的属性 |
__class__ | 获取类对象 |
__name__ | 获取类名 |
__doc__ | 说明文档 |
__module__ | 获取指定的类声明在哪个模块中,返回模块名 |
__bases__ | 返回当前类的所有的父类 |
__slots__ | 约束当前类有哪些属性 |
1.1魔法方法
- 定制当前类的对象的打印内容
魔法方法 | 说明 |
---|---|
def __str__ | 影响单独打印对象的效果 |
def __repr__ | 对象作为元素的时候的打印效果 |
2.私有化 getter和setter
私有化 -- 属性前加__
getter -- 希望获取对象的值之前做点别的事情的时候使用
- @property
def 去掉属性的下划线(self)
return 值
- setter -- 希望给对象的属性赋值前要做点别的事情的时候使用
- 必须先getter
- @ getter名.setter
def 去掉属性的下划线(self, x)
self.带下划线的属性 = 值
3.继承
class 类(父类):
类的内容
class 类(父类):
def __init__(self)
super().__init__()
类中方法的调用过程:先看当前类中是否有对应的方法.如果没有就去父类找,父类没有再去父类的父类找,以此类推,如果找到object还没找到才会报错在哪个类先找到就直接调用对应的方法
super 的使用: 可以在子类的对象方法和类方法中去通过"super()."的方式去调用父类的对象和方法
4 . 抛出异常
- 4 .1 抛出异常
raise 异常类型
- 4 .2 定义错误类
class SelfError(Exception)
def __str__(self):
return '描述异常'
一. 运算符重载
1 .什么是运算符重载
- python中所有的类型都是类,所有的数据都是类的对象
- python中使用运算符的时候,实质会去调用这个运算符对应的魔法方法.
- 类的对象是否支持相应的运算符,就看这个类有没有实现对应的魔法方法
import copy
class Student:
def __init__(self, name, number=1, age=0):
self.name = name
self.age = age
self.number = number
def __repr__(self):
return self.name
# + 的魔法方法
def __add__(self, other):
return '%s加%s 等于:%s' % (str(self), str(other), str(self)+str(other))
# * 的魔法方法
def __mul__(self, other):
stus = []
for index in range (other):
stus.append(copy.copy(self))
stus[index].name = self.name[:]+str(index)
return stus
# > 的魔法方法
# 注意:>和<的魔法方法只需要实现一个,另外一个自动支持
def __gt__(self, other):
return True
stu1 = Student('超级')
stu2 = Student('玛丽')
print(stu1+stu2)
print(stu1 * 12)
print(stu1>stu2)
三.内存管理
1.内存可以分为栈区间和堆区间
- 栈上的内存是 系统自动开辟 自动释放
- 堆上的内存需要 手动开辟 手动释放
- 但是在python中堆上的内存空间会通过python提供的内存管理机制自动管理
2.内存的管理机制
- python中所有的变量都是保存在栈区间的,并且所有的变量保存的都是数据的地址:
- 所有的对象(数据)都是保存在堆区间.
2.2 内存的释放(垃圾回收机制)
- python中每一个对象都有一个默认的属性来保存这个对象的引用计数.(看这个对象的地址被多个变量或者数据存储,如果一个变量存了一个对象的地址,我们就说这个变量是这个对象的引用)
- 一个对象是否销毁就看这个对象的引用计数是否为0,只要为0 就会被销毁
from sys import getrefcount
getrefcount(对象) 查看对象的引用计数
- 变量赋值原理:先在堆空间开辟空间将数据存储起来,然后将地址返回给变量(通用)如果数据是数字和字符串,会先在内存中查看之前是否已经存储过这个输入如果存储过直接返回之前的地址,没有存储过的才会开辟空间存数据