'''尚学堂学习打卡记录,用于复习'''
面向对象(OOP):
1.针对大型软件设计而来,使得程序扩展性更强,可读性更好。
2.通过将数据和操作的相关方法封装到对象中,组织代码和数据的方式更加接近人的思维,大大提高了编程效率
3.python完全支持面向对象的基本功能:继承,多态,封装等
4.python中一切皆对象
5.python支持面向过程,面向对象,函数式编程等多种编程范式
6.面向过程编程更加关注程序的逻辑流程,适合编写小规模程序,面向对象更关注软件中对象之间的关系,适合编写大规模程序
7.面向对象帮助我们从宏观上把握,从整体上分析整个系统,具体到实现部分的微观操作,仍需要面向过程的思路去处理
8.面向过程和面向对象是相辅相成的,面向对象离不开面向过程
定义一个类:
class Student: #类名一般首字母大写,多单词采用驼峰原则
def __init__(self, name, score): #self必须位于第一个参数
self.name = name
self.score = score
def say_score(self):
print('{0}的分数是:{1}'.format(self.name, self.score))
s1 = Student('tz', 18)
s1.say_socore()
s1.age = 32 #给类对象s1的新增age属性并引用对象32
__init__()方法:初始化创建好的对象,初始化指给实例属性赋值
__new__()方法:用于创建对象,一般无需重定义该方法
要点:
1.定义实例方法时,第一个参数必须为self,self指当前的实例对象
2.调用实例方法时,不需要给self传参,解释器自动传参
其他操作:
1.dir(obj) 可以获得对象的所有属性方法
2.obj.__dict__ 获取对象的属性字典
3.pass 空语句
4.isinstance(对象,类型) 判断对象是不是指定类型
类方法:类方法是从属于类对象的方法
@classmethod
def 类方法名(cls [, 形参列表]):
函数体
要点如下:
1.@classmethod 必须位于方法上面一行
2.第一个cls必须有,cls指的就是类对象本身
3.调用类方法的格式:类名.类方法名(参数列表),参数列表中,不需要也不能给cls传值
4.类方法中访问实例属性和实例方法会导致错误
5.子类继承父类的方法是,传入cls是子类对象,而非父类对象
__del__()方法(析构函数)和垃圾回收机制:
__del__方法称为析构方法,用于实现对象被销毁时所需要的操作,比如:释放对象占用的资源,python实现自动的垃圾回收,当对象的引用计数为0时,由垃圾回收器调用__del__方法,我们也可以通过del语句删除对象,从而保证调用__del__方法,系统会自动提供__del__方法,一般不需要自定义析构方法
__call__()方法:定义了__call__方法的对象,称为可调用对象,即对象可以像函数一样被调用
python中的方法没有重载
方法的动态性:Python时动态语言,我们可以动态的为类添加新的方法,后者动态地修改类已有地方法。
Python地私有成员和私有方法:通过__属性名(方法名)来规定私有地属性(方法),类外部不能直接访问,通过_类名__私有属性(方法)来访问私有属性(方法)
@property装饰器:
被@property装饰的方法用于获取属性值,被装饰的方法名用作属性名
@属性名.setter装饰的方法是设置属性值的方法
@属性名.deleter装饰的方法是删除属性值的方法
面向对象的三大特征:
1.封装:隐藏对象的属性和实现细节,只对外提供必要的方法
2.继承:让子类具有父类的特性,提高代码的重用性
3.多态:同一个方法由于对象不同产生不同的行为
语法格式:Python支持多重继承,一个子类可以继承多个父类
class 子类类名(类名1[,父类2,...]):
类体
如果在类定义中没有指定父类,则默认父类是object类,也就是说object是所有类的父类,里面定义了一些所有类共有的默认实现,比如:__new__()
定义子类时,必须在其构造函数中调用父类的构造函数,格式为:父类名.__init__(self,参数列表)
类成员的继承和重写:
1.成员继承:子类继承父类除构造方法之外的所有成员
2.方法重写:子类可以重新定义父类中的方法,这样就会覆盖父类的方法,也称为重写
通过类的方法mro()或者类属性__mro__可以输出这个类的继承结构层次:
class A:pass
class B(A):pass
class C(B):pass
print(C.mro())
Python支持多继承,如果父类中有相同名字的方法,在子类没有指定父类名时,解释器按照从左向右按顺序搜索
MRO(Method Resolution Order):方法解析顺序,我们通过mro()方法获得类的层次结构,方法解析顺序也是按照这个类的层次结构寻找的
在子类中,如果想要获得父类的方法时,我们可以通过super()来调用,super()代表父类的定义,不是父类的对象:
class A:
def say(self):
print("A:", self)
class B(A):
def say(self):
#A.say(self)
super().say()
print("B:", self)
B().say()
由于Python中一切皆对象,+ - * / 等运算都是通过方法实现的,可以通过重载这些方法实现一些操作:
对象常见的特殊属性
对象的赋值,浅拷贝,深拷贝
组合和继承的关系
继承:实现子类拥有父类的方法和属性
组合:让一个类成为另一个类的属性,实现一个类拥有另一个类的方法和属性