目录
继承
继承指的是多个类之间的所属关系,即子类默认继承父类的所有属性和方法。
在python中,所有类默认继承object类,object类是顶级类或基类;其他子类叫做派生类。
单继承
一个类继承一个父类
多继承
一个类同时继承了多个父类
注:当一个类有多个父类的时候,默认使用第一个父类的同名属性和方法
子类重写父类同名方法和属性
如果子类重写父类拥有的同名属性和方法,子类创建对象调用属性和方法的时候,调用到的是子类里面的同名属性和方法。
类. _mro_:表明该类的继承关系
子类如何调用父类的同名方法和属性
class Master(object):
def __init__(self):
self.kongfu = '[古法煎饼果子配方]'
def make_cake(self):
print(f'运用{self.kongfu}制作煎饼果子')
class School(object):
def __init__(self):
self.kongfu = '[黑马煎饼果子配方]'
def make_cake(self):
print(f'运用{self.kongfu}制作煎饼果子')
class Prentice(School, Master):
def __init__(self):
self.kongfu = '[独创煎饼果子技术]'
def make_cake(self):
self.__init__()
print(f'运用{self.kongfu}制作煎饼果子')
#子类调用父类的同名方法和属性:把父类的同名属性和方法再次封装
def make_master_cake(self):
#父类.函数()
#再次调用初始化的原因:这里想要调用父类的同名方法和属性,属性在init初始化位置,所以需要再次调用
#如果定义的类名修改,这里也要修改。麻烦:代码量庞大,冗余
Master.__init__(self)
Master.make_cake(self)
def make_school_cake(self):
School.__init__(self)
School.make_cake(self)
tudi = Prentice()
tudi.make_cake()
# print(Prentice.__mro__)
tudi.make_master_cake()
tudi.make_school_cake()
tudi.make_cake()
"""
运用[独创煎饼果子技术]制作煎饼果子
运用[古法煎饼果子配方]制作煎饼果子
运用[黑马煎饼果子配方]制作煎饼果子
运用[独创煎饼果子技术]制作煎饼果子
"""
super()调用父类方法
语法1:
super(当前类名,self).函数()
语法2:
super().函数()
注:使用super()可以自动查找父类。调用顺序遵循_mro_类属性的顺序。比较适合单继承使用
私有权限
可以为实例属性和方法设置私有权限,即设置某个实例属性或实例方法不继承给子类。
设置私有权限的方法:在属性名和方法名前面加上两个下划线__。
语法:
class 类名():
#私有属性
__属性名 = 值
#私有方法
def __函数名(self):
代码
获取和修改私有属性值
在python种一般定义函数名为get_xx用来获取私有属性,定义set_xx用来修改私有属性值
面向对象三大特性:
1.封装
①将属性和方法书写到类的里面的操作即为封装
②封装可以为属性和方法添加私有权限
2.继承
①子类默认继承父类的所有方法和属性
②子类可以重写父类属性和方法
3.多态
①传入不同的对象,产生不同的结果
多态
定义:多态是一种使用对象的方式,子类重写父类方法,调用不同子类对象的相同父类方法,可以产生不同执行结果
好处:调用灵活,有了多态,更容易编写出通用的代码,做出通用的编程,以适应需求的不断变化。
实现步骤:
①定义父类,并提供公共方法
②定义子类,并重写父类方法
③传递子类对象给调用者,可以看到不同子类执行效果不同
类属性和实例属性
类属性
类属性:就是类对象所拥有的属性,它被该类的所有实例对象所共有
类属性可以使用类对象或实例对象访问
优点:
①记录的某项数据始终保持一致时,则定义类属性
②实例属性要求每个对象为其单独开辟一份内存空间来记录数据,而类属性为全类所共有,仅占用一份内存,更加节省内存空间。
修改类属性
类属性只能通过类对象修改,不能通过实例对象修改,如果通过实例对象修改类属性,表示的是创建了一个实例属性。
语法:
类.类属性
类方法和静态方法
类方法
语法:
@classmethod
def info_print():
代码
特点:类方法需要用装饰器 @classmethod 来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以cls 作为第一个参数
使用场景:
①当方法中需要使用类对象(如获取私有类属性等)时,定义类方法
②类方法一般和类属性配合使用
静态方法
语法:
@staticmethod def info_print(): 代码
特点:
①需要通过装饰器@staticmethod 来进行修饰,静态方法既不需要传递类对象也不需要传递实例对象(形参没有self/cls)
②静态方法也能够通过实例对象和类去访问
使用场景:
①当方法中既不需要使用实例对象(如实例对象,实例属性),也不需要使用类对象(如类属性,类方法,创建实例等)时,定义静态方法
②取消不需要的参数传递,有利于减少不必要的内存占用和性能消耗