第十一章 掌握Python的面向对象

 1.1 彻底理解面向对象的基础理念

理解面向对象
1.什么是对象
对象指的是数据类型的 一个实例。
2.什么是面向对象
面向对象的核心是抽象(概括和归类),抽象过后的数据类型就叫类(属性与方法组成)
3.面向对象的三大特征
封装:隐藏其内部细节,对外仅提供接口。保障了数据的完整性,实现代码复用。
继承:子类继承父类,实现代码复用与扩展。
多态:父类方法的多种不同实现方式,通过多个子类的继承,再赋值给父类对象。

 

2.1 掌握类属性,类方法,静态方法

 

class关键字与类
系统自带的所有数据类型都是类(int、String、list等),使用class自定义的数据类型叫做类
语法:class ClassName:pass 
类名的规则:驼峰命名法,单词首字母都大写

 

类属性和类方法
1.类属性:直接定义
2.类方法:表示该数据类型共有的行为。通常用def定义,再函数前加上@classmethod修饰符,类方法中需要一个参数cls(class的缩写)

 

类的实例化
语法:object = ClassName()

 

类的静态方法
前面需要加@staticmethod的修饰符,与类方法类似。区别:无需定义任何描述类的形参
语法:
@staticmethod 
def method_name(*args,**kwargs):
               //pass
类方法与静态方法都是全局方法,可以被所有实例化对象共享

 

2.1 彻底掌握对象属性和对象方法

类的构造函数

对类进行实例化时,如果没有定义构造函数,那么Python将会自动创建一个不带参数的构造函数来进行实例化。


语法结构:

class Class_Name: 
    def _ _init_ _(self): 
     //pass

_ _init_ _就是构造函数,self表示当前对象。不管是cls还是self,都是一种通用写法(意思就是可以写成其他名),Python会自动将当前对象或类型进行绑定,无需显示地传递。

实例化后,构造函数会自动执行

 

 

对象属性
定义对象属性:self.name = value 这里的self类似Java中的this

 

对象方法
语法:
def method_name(self):
//pass 
类方法面向全局,对象方法面向对象,必须有参数。默认设置一个self在里面。

 

3.1 彻底掌握封装和继承

 

类的封装
将内部细节隐藏,对外提供接口。在属性名或者方法名前面加上双下划线,来对属性和方法进行访问控制。对外不可访问,对内可以。

 

类的继承
语法:
class Child(Parent1,Parent2,....):
//pass
没有父类则无需加括号,继承单个父类叫单继承,继承多个父类叫多继承。

子类可以调用父类的方法,如子类中定义了与父类同名的方法,则会覆盖。

 

 

4.1 彻底掌握魔术属性和魔术方法

 

常用的魔术属性

1._ _class_ _:返回实例对象的数据类型(类类型)

 

2._ _dict_ _:对于类类型来说,保存的是属性与方法。对于实例对象来说,保存的是实例对象的属性

3._ _doc_ _:返回描述信息(注释)

 

 

常用的魔术方法
类中的魔术方法会自动被调用,好比_ _init_ _
1._ _str_ _:当输出实例对象的内存地址时,则输出里面的返回值,返回值必须为字符串

 

 

2._ _call_ _:对call方法进行重写,可以使实例化对象像方法一样调用 

 

3._ _getattr_ _(self,name):name表示属性名,访问不存在的属性会触发该函数的调用,实现属性的惰性初始化(仅需要的时候才定义相关属性)

4._ _getitem_ _(self,key):在类中定义了此方法后可直接调用实例化对象,并用[]来获取对象属性。key表示属性名或者索引

5._ _setitem_ _:使用[]来给对象赋值,使用方法与getitem相同

 

 

4.1super类型与MRO

 

什么是super类型
返回一个代理对象。通过该对象来执行父类中的方法
基本语法:super(type,arg):type表示子类的类型名,默认当前子类类型。arg可以是类类型,也可以是对象类型。无需显示传递,Python会自动传递对应的参数。

 

方法解析顺序:MRO
super可以返回父类的代理对象,那假如子类存在有多个父类,父类中又存在同名的方法,那么Python将通过MRO来解析调用的顺序。在定义类类型时,Python会自动为该类型添加一个_ _mro_ _的魔法属性,该属性为元组,存储了当前子类的继承链

  

5.1可迭代对象与迭代器

 

什么是可迭代对象

在类中定义了_ _iter_ _方法,那么该类的实例对象就可以拿来迭代,类似字符串、元组这些。定义为可迭代对象后,需要定义_ _next_ _方法来确定迭代逻辑

iter方法是用来表明可迭代性质,next方法是用来实现迭代逻辑

定义迭代逻辑需要遵循两个原则:1.在next中放回下一项 2.无法再获取下一项时,必须抛出Sto'pIteration异常

 

 

6.1类装饰器与属性装饰器

 

类装饰器

核心在于_ _init_ _和_ _call_ _函数,init用来传递需要修饰的函数,call用来扩展函数的逻辑

同函数装饰器一样,也分带参装饰器与不带参装饰器

1.不带参数的类装饰器

 

2.带参数的类装饰器(_ _init_ _用来定义参数,_ _call_ _用来传递被修饰的函数,同时需要多定义一个闭包函数)

 

 

 

属性装饰器

在属性名前加上_ _双下划线,那么属性就变成私有的了。私有属性只能在类/对象作用域中访问(类似private的封装)

@property:对方法进行装饰,等同实现了get_xx方法

 

 @func.setter:设置属性值,等同实现了set_xx方法

 

 

7.1 彻底掌握Python中的元类

 

type元类

使用元类可以动态的创建类。

语法:type(name,bases,dict) name表示类名(字符串),bases表示基类(父类),是一个元组类型。dict表示类的属性与函数,是一个字典。键名为属性名和函数名,键值为属性值与函数的具体实现

可以看出Kitty被定义成一个类对象,他的类名是Animal 

 

Dog类继承了Animal类的对象Kitty(相当于继承了Animal),所以Dog可以调用父类的属性与方法 

 

如果字典值传入的是方法,则需要先定义好方法的具体实现。假如是类方法、静态方法,则需要加上修饰符 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值