一、析构函数
用于资源回收,销毁对象,回收内存
def __del__(self):
在没有被引用的情况下,解析器会 自动调用 此函数,来释放内存空间
在程序结束了才 自动调用
dog=Animal("小狗")
del dog
手动调用,析构函数也执行
释放完dog对象,就不能使用对象了
没写这个析构函数,程序也会执行
二、三大特征
python 展现面向对象的 三大特征:
1.封装
*其实就是使用__init__(初始化构造方法)将内容 封装到对象中
通过对象直接 or self来获取封装的内容*
2.继承
*子继承父* 节省开发时间,增强开发效率
减少代码的重复编写,精简代码的层级结构,便于扩展
子类为派生类,父类为基类
3.多态
1、单继承
class Accessories(object): # 父类
def Interesting(self):
print("很好看")
# 子类
class Watch(Accessories):
def Wrist(self):
print("手表戴在手腕上")
class Necklace:
def Neck(self):
print("项链戴在脖子上")
手表有继承父类, 项链没有
w1=Watch()
w1.Interesting() 继承了父类的行为
2、多继承
#父类
class A(object):
class B(object):
#子类
class c(A,B):
注意查找行为的顺序
用广度优先的方法去看待
1、
class A1(object):
def name(self):
print('a1.name')
class B(A1):
def name(self):
print('b.name')
b1=B()
b1.name()
若 **子类和父类** 中有相同命名的行为:
输出的是 子类的行为
b.name
2、
class A1(object):
def name(self):
print('a1.name')
class A2(object):
def name(self):
print('a2.name')
class E(A2,A1):
pass
e1=E()
e1.name()
若**多个父类**中有相同命名时:
按照书写的顺序 class E(A2,A1): a2.name
class E(A1,A2): a1.name
决定输出
3、
class A1(object):
def name(self):
print('a1.name')
class B(A1):
def name(self):
print('b.name')
class C(A1):
pass
class D(C,B):
pass
d1=D()
d1.name()
若**孙子....**
假设父亲(B)爷爷(A1)都有隐性基因,母亲没有此隐性基因
孙子继承的是父亲的(好家伙开始乱讲生物了)
(因为广度优先,父亲跟孩子更近。。。)
结果为:b.name
如果母亲(C)继承了爷爷(A1)的行为,系统会报错
自行体会吧,这么说只是为了让自己更好理解
4、
跨越继承
3、重写父类
方法覆盖
(继续是首饰的例子)
class Accessories(object): # 父类
def __init__(self,color,size):#!!!!此处注意
self.color=color
self.size=size
def Interesting(self):
print("很好看")
# 子类
class Watch(Accessories):
def __init__(self): #!!!!此处注意
pass
def Interesting(self): #重写
print("一般般")
def Wrist(self):
print("手表戴在手腕上")
若父类有def __inif__ 则子类必须有def __inif__
否则报错
三、类与对象与实例
class A: #类对象
color='yellow' #类属性
def __init__(self,size):
self.size=size #实例属性
通过 实例对象 访问 类属性
a1=A(8)
print(a1.color)
通过 实例对象 访问 实例属性
print(a1.size)
通过 类对象( A ) 访问 类属性
print(A.color)
但! 类对象 不能访问 实例对象
# print(A.size)
类方法
实例对象a1 访问 类属性
class A: # 类对象
color = 'yellow' # 类属性
#类方法 访问类属性
def get_color(cls):
return cls.color
a1 = A()
print(a1.get_color())
类方法访问类属性
@classmethod #!!!!!不加 就会报错!!
def get_color(cls):
return cls.color
print(A.get_color()) #此处为类对象
可通过类方法修改类属性
@classmethod
def change_color(cls,new):
cls.color=new
A.change_color('red')
cls和self的区别:https://www.zhihu.com/question/49660420?sort=created