感觉我的日记好像少了点自己的理解,今天尝试下
继承
继承就是子类可以保留父类的某些属性,若该属性在子类中发生变化,还可以将父类的该属性覆盖掉。如果子类中定义与父类同名的方法或属性,则会自动覆盖父类对应的方法或属性。
继承在定义类的时候添加
如:class Child(Parent):
表示Child继承Parent的类
eg:
输出:
输出:
下面通过一个例子来说明__init__被覆盖该怎么办:
eg:
调用:
输出:
会发现,在调用shark.move()时,会报错。错误中说Shark中没有所属变量x。
因为定义Shark的时候,其中__init__()将父类的_init__覆盖了,而父类中才会有x和y。
解决办法:
1.使用super()函数
super函数:可以保留原有父类属性的定义,还能改动子类的该属性。
2.在子类与父类重合的部分中,在子类的定义里调用未绑定的父类方法
未绑定:大概就是说可变的吧。。。
绑定:python中的方法需要有实例才能被调用
输出:
多重继承
多重继承:一个类可以同时继承其他多个类
eg:
输出:
组合
组合:把类的实例化放到一个新的类当中
eg:
可以看到:
self.turtle是在Pool类中,__init__函数中的变量,Turtle(x)是Turtle类的一个实例
输出:
当属性名和方法名相同时,则属性覆盖方法
issubclass(class,classinfo):检查class是否为classinfo的子类,是则返回true
一个类被认为是自身的子类。
classinfo可以是类对象组成的元组,只要class与其中任何一个候选类的子类,则返回True
eg:
输出:
isinstance(object,classinfo):检查object是否属于classinfo(实例属于类)
eg:
如果第二个参数不是类或类对象组成的元组,会抛出一个typeerror异常
输出:
hasattr(object,name):实例中有无为name的属性
eg:
需要用字符串将属性名引上
输出:
getattr(object,name[,default]):返回实例的指定属性值,若不存在 则打印default
eg:
输出:
setattr(object,name,value):设置对象中指定属性的值,若不存在则新建属性并给他赋值
输出:
delattr(object,name): 删除属性的值,若属性不存在则抛出异常
eg:
property和@property
这里直接给出博主的日志IP解释property
魔法方法
魔法方法是面向对象的python的一切,体现在他们总能够在适当的时候被自动调用
__init __
eg:
__ init __(self,x,y):这里的x,y是传入的参数,参数在类的实例化时给定
self.x&self.y是类实例化后的实例对象的局部变量
注意:init()返回的是None,不要试图给__init__做任何的返回
输出:
__ new __()
当继承的类是不可改变类型并且我们需要对其进行修改时,需在子类重定义new,否则会调用基类的new
eg:
定义了一个新的string
输出:
__ del __:类似析构函数
del:并不是一个对象del都会调用__del__,当所有对该类的引用都被del之后,才会启动回收机制,调用__del__方法
eg: