一、继承的概念
生活中的继承,一般指的是子女继承父辈的财产。
拓展1:经典类或旧式类
不由任意内置类型派生出的类,称之为经典类。
class 类名:
代码
拓展2:新式类(常用)
class 类名(object):
代码
python面向对象的继承指的是多个类之间的所属关系,即子类继承父类的所有属性和方法。
体验:
# 继承:子类默认继承父类的所有属性和方法 # 1. 定义父类 class A(object): def __init__(self): self.num = 1 def info_print(self): print(self.num) # 2. 定义子类,继承父类 class B(A): pass # 3. 创建对象,验证结论 result = B() result.info_print()
在python中,所有类默认继承object类,object类是顶级类或基类;其他子类叫做派生类。
二、单继承
# 1. 师傅类,属性和方法 class Master(object): def __init__(self): self.kongfu = '[葵花宝典]' def make_cake(self): print(f'运用{self.kongfu}打倒对手') # 2. 徒弟类,继承师傅类 class Prentice(Master): pass # 3. 用徒弟类创建对象,调用实例属性和方法 num = Prentice() # 4. 对象访问实例属性 print(num.kongfu) # 5. 对象调用实例方法 num.make_cake()
三、多继承
所谓多继承就是一个类同时继承了多个父类。
# 1. 师傅1类,属性和方法 class Master1(object): def __init__(self): self.kongfu = '[葵花宝典]' def make_cake(self): print(f'运用{self.kongfu}打倒对手') # 2. 师傅2类,属性和方法 class Master2(object): def __init__(self): self.kongfu = '[九阴白骨爪]' def make_cake(self): print(f'运用{self.kongfu}打倒对手') # 2. 徒弟类,继承师傅类 class Prentice(Master2, Master1): pass # 3. 用徒弟类创建对象,调用实例属性和方法 num = Prentice() # 4. 对象访问实例属性 print(num.kongfu) # 5. 对象调用实例方法 num.make_cake()
注意:当一个类有多个父类的时候,默认使用第一个父类的同名属性和方法。
四、子类重写父类同名方法和属性
# 1. 师傅类,属性和方法 class Master1(object): def __init__(self): self.kongfu = '[葵花宝典]' def make_cake(self): print(f'运用{self.kongfu}打倒对手') # 2. 徒弟类,继承师傅类 class Prentice(Master1): def __init__(self): self.kongfu = '[自创秘籍]' def make_cake(self): print(f'运用{self.kongfu}打倒对手') # 3. 用徒弟类创建对象,调用实例属性和方法 num = Prentice() # 4. 对象访问实例属性 # [自创秘籍] print(num.kongfu) # 5. 对象调用实例方法 # 运用[自创秘籍]打倒对手 num.make_cake() # (<class '__main__.Prentice'>, <class '__main__.Master1'>, <class 'object'>) print(Prentice.__mro__)
子类和父类具有同名属性和方法,默认使用子类的同名属性和方法。
__mro__显示继承顺序,如代码:
(<class '__main__.Prentice'>, <class '__main__.Master1'>, <class 'object'>)
Prentice-->Master1-->object
五、子类调用父类的同名方法和属性
class Master1(object): def __init__(self): self.kongfu = '[葵花宝典]' def make_cake(self): print(f'运用{self.kongfu}打倒对手') class Master2(object): def __init__(self): self.kongfu = '[九阴白骨爪]' def make_cake(self): print(f'运用{self.kongfu}打倒对手') # 2. 徒弟类,继承师傅类 class Prentice(Master1, Master2): def __init__(self): self.kongfu = '[自创秘籍]' def make_cake(self): # 加自己初始化的原因:如果不加这个自己的初始化,kongfu属性值是上一次调用的init属性值 self.__init__() print(f'运用{self.kongfu}打倒对手') def make_master1_cake(self): # 父类名.函数() # 再次调用初始化的原因:这里想要调用父类的同名方法和属性,属性在init初始化位置,所以需要再次调用init Master1.__init__(self) Master1.make_cake(self) def make_master2_cake(self): Master2.__init__(self) Master2.make_cake(self) # 3. 用徒弟类创建对象,调用实例属性和方法 num = Prentice() # 4. 对象访问实例属性 # [自创秘籍] # print(num.kongfu) # 5. 对象调用实例方法 # 运用[自创秘籍]打倒对手 num.make_cake() num.make_master1_cake() num.make_master2_cake() num.make_cake()
六、多层继承
class Master1(object): def __init__(self): self.kongfu = '[葵花宝典]' def make_cake(self): print(f'运用{self.kongfu}打倒对手') class Master2(object): def __init__(self): self.kongfu = '[九阴白骨爪]' def make_cake(self): print(f'运用{self.kongfu}打倒对手') # 2. 徒弟类,继承师傅类 class Prentice(Master1, Master2): def __init__(self): self.kongfu = '[自创秘籍]' def make_cake(self): # 加自己初始化的原因:如果不加这个自己的初始化,kongfu属性值是上一次调用的init属性值 self.__init__() print(f'运用{self.kongfu}打倒对手') def make_master1_cake(self): # 父类名.函数() # 再次调用初始化的原因:这里想要调用父类的同名方法和属性,属性在init初始化位置,所以需要再次调用init Master1.__init__(self) Master1.make_cake(self) def make_master2_cake(self): Master2.__init__(self) Master2.make_cake(self) # 步骤:1.创建类Tusun,用这个类创建对象;2. 用这个对象调用父类的属性或方法看能否成功 class Tusun(Prentice): pass xiaoai = Tusun() # 运用[自创秘籍]打倒对手 xiaoai.make_cake() # 运用[葵花宝典]打倒对手 xiaoai.make_master1_cake()
七、super()调用父类方法
class Master1(object): def __init__(self): self.kongfu = '[葵花宝典]' def make_cake(self): print(f'运用{self.kongfu}打倒对手') class Master2(Master1): def __init__(self): self.kongfu = '[九阴白骨爪]' def make_cake(self): print(f'运用{self.kongfu}打倒对手') # super()带参数写法 # super(Master2, self).__init__() # super(Master2, self).make_cake() # super() 无参数 super().__init__() super().make_cake() # 2. 徒弟类,继承师傅类 class Prentice(Master2): def __init__(self): self.kongfu = '[自创秘籍]' def make_cake(self): # 加自己初始化的原因:如果不加这个自己的初始化,kongfu属性值是上一次调用的init属性值 self.__init__() print(f'运用{self.kongfu}打倒对手') def make_master1_cake(self): # 父类名.函数() # 再次调用初始化的原因:这里想要调用父类的同名方法和属性,属性在init初始化位置,所以需要再次调用init Master1.__init__(self) Master1.make_cake(self) def make_master2_cake(self): Master2.__init__(self) Master2.make_cake(self) # 需求:一次性调用父类Master1 Master2的方法 def make_old_cake(self): # 方法一:父类类名如果变化,这里代码需要频繁修改;代码量庞大,冗余。 # Master1.__init__(self) # Master1.make_cake(self) # Master2.__init__(self) # Master2.make_cake(self) # 方法二:super()带参数写法 # 2.1 super(当前类名,self).函数() # super(Prentice, self).__init__() # super(Prentice, self).make_cake() # 2.2 super()无参数 super().__init__() super().make_cake() num1 = Prentice() num1.make_old_cake()
八、私有权限
8.1 定义私有属性和方法
在python中,可以为实例属性和方法设置私有属性,即设置某个实例属性或实力方法不继承给子类。
设置私有权限的方法:在属性名或方法名 前面 加上两个下划线__。
从Prentice类开始添加:
class Master1(object): def __init__(self): self.kongfu = '[葵花宝典]' def make_cake(self): print(f'运用{self.kongfu}打倒对手') class Master2(object): def __init__(self): self.kongfu = '[九阴白骨爪]' def make_cake(self): print(f'运用{self.kongfu}打倒对手') # 2. 徒弟类,继承师傅类 class Prentice(Master1, Master2): def __init__(self): self.kongfu = '[自创秘籍]' # 定义私有属性 self.__money = 2000000 # 定义私有方法 def __info_print(self): print(self.kongfu) print(self.__money) def make_cake(self): # 加自己初始化的原因:如果不加这个自己的初始化,kongfu属性值是上一次调用的init属性值 self.__init__() print(f'运用{self.kongfu}打倒对手') def make_master1_cake(self): # 父类名.函数() # 再次调用初始化的原因:这里想要调用父类的同名方法和属性,属性在init初始化位置,所以需要再次调用init Master1.__init__(self) Master1.make_cake(self) def make_master2_cake(self): Master2.__init__(self) Master2.make_cake(self) # 步骤:1.创建类Tusun,用这个类创建对象;2. 用这个对象调用父类的属性或方法看能否成功 class Tusun(Prentice): pass xiaoai = Prentice() # 对象不能访问私有属性和私有方法 # print(xiaoai.__money) # xiaoai.__info_print() xiaohong = Tusun() print(xiaohong.__money) # 无法访问实例属性__money xiaohong.__info_print()
注意:私有属性和私有方法只能在类里面访问和修改
8.2 获取和修改私有属性值
在python中,一般定义函数名get__xx用来获取私有属性,定义set__xx用来修改私有属性值。
class Master1(object): def __init__(self): self.kongfu = '[葵花宝典]' def make_cake(self): print(f'运用{self.kongfu}打倒对手') class Master2(object): def __init__(self): self.kongfu = '[九阴白骨爪]' def make_cake(self): print(f'运用{self.kongfu}打倒对手') # 2. 徒弟类,继承师傅类 class Prentice(Master1, Master2): def __init__(self): self.kongfu = '[自创秘籍]' # 定义私有属性 self.__money = 2000000 # 获取私有属性 def get__money(self): return self.__money # 修改私有属性 def set__money(self): self.__money =15000 # 定义私有方法 def __info_print(self): print(self.kongfu) print(self.__money) def make_cake(self): # 加自己初始化的原因:如果不加这个自己的初始化,kongfu属性值是上一次调用的init属性值 self.__init__() print(f'运用{self.kongfu}打倒对手') def make_master1_cake(self): # 父类名.函数() # 再次调用初始化的原因:这里想要调用父类的同名方法和属性,属性在init初始化位置,所以需要再次调用init Master1.__init__(self) Master1.make_cake(self) def make_master2_cake(self): Master2.__init__(self) Master2.make_cake(self) # 步骤:1.创建类Tusun,用这个类创建对象;2. 用这个对象调用父类的属性或方法看能否成功 class Tusun(Prentice): pass xiaoai = Tusun() # 调用get__money函数获取私有属性money的值 print(xiaoai.get__money()) # 调用set__money函数修改私有属性money的值 xiaoai.set__money() print(xiaoai.get__money())
标签:__,继承,self,面向对象,init,cake,make,def From: https://www.cnblogs.com/yz-b/p/16923962.html