继承介绍以及单继承
程序中的继承 在程序中,继承描述的是多个类之间的所属关系。 如果一个类A里面的属性和方法可以复用,则可以通过继承的方式,传递到类B里。 那么类A就是基类,也叫做父类;类B就是派生类,也叫做子类。
单继承:子类只继承一个父类
很久很久以前(long long ago:)曾经有这样一个故事: 情节:煎饼果子老师傅在煎饼果子界摸爬滚打几十年,拥有一身精湛的煎饼果子技术,并总结了一套"古法煎饼果子配方"。 可是老师傅年迈已久,在嗝屁之前希望把自己的配方传承下去,于是老师傅把配方传给他的徒弟大猫...
单继承
说明: 虽然子类没有定义__init__方法初始化属性,也没有定义实例方法,但是父类有。所以只要创建子类的对象,就默认执行了那个继承过来的__init__方法 总结: 子类在继承的时候,在定义类时,小括号()中为父类的名字 父类的属性、方法,会被继承给子类
剧情发展: 大猫掌握了师傅的配方,可以制作古法煎饼果子。但是大猫是个爱学习的好孩子,他希望学到更多的煎饼果子的做法,于是通过百度搜索,找到了一家煎饼果子培训学校。(多继承)
多继承:子类继承多个父类
多继承
多继承可以继承多个父类,也继承了所有父类的属性和方法 注意:如果多个父类中有同名的 属性和方法,则默认使用第一个父类的属性和方法(根据类的魔法属性mro的顺序来查找) 多个父类中,不重名的属性和方法,不会有任何影响。
剧情发展: 大猫掌握了 师傅的配方 和 学校的配方,通过研究,大猫在两个配方的基础上,创建了一种全新的煎饼果子配方,称之为 "猫氏煎饼果子配方"。(子类重写父类同名属性和方法
子类调用父类同名属性和方法
核心点: 无论何时何地,self都表示是子类的对象。在调用父类方法时,通过传递self参数,来控制方法和属性的访问修改。 剧情发展: 大猫的煎饼果子店非常红火,终于有一天,他成了世界首富!! 但是他也老了,所以他希望把 师傅的配方 和 学校的配方 以及自己的配方 继续传承下去...(多层继承)
调用父类方法super()
实现一个简单的金融类,要求功能有:
父类股票类,控股法输出股票买入和卖出;
子类(公募机构)继承自父类,操作输出公募机构买入和卖出;
子类(私募机构)继承自父类,操作输出私募机构买入和卖出;
创建对象实现相关方法的调用 尝试使用尽可能多的方法调用父类方法
子类(公募机构)学会了父类的控股法操作
子类(私募机构)学会了父类的控股法操作并专研了自己的输出股票和私募买入和卖出(重写)
私有权限
封装的意义: 将属性和方法放到一起做为一个整体,然后通过实例化对象来处理; 隐藏内部实现细节,只需要和对象及其属性和方法交互就可以了; 对类的属性和方法增加 访问权限控制。
私有权限:在属性名和方法名 前面 加上两个下划线 __ 类的私有属性 和 私有方法,都不能通过对象直接访问,但是可以在本类内部访问; 类的私有属性 和 私有方法,都不会被子类继承,子类也无法访问; 私有属性 和 私有方法 往往用来处理类的内部事情,不通过对象处理,起到安全作用。
私有属性和私有方法
私有方法
私有属性
类部调用私有属性和私有方法
子类不能继承父类私有属性和方法
私有属性和私有方法
1). 私有属性,可以在类内部通过self调用,但不能通过对象访问
2). 私有方法,可以在类内部通过self调用,但不能通过对象访问
3). 对象不能访问私有权限的属性和方法
4). 子类不能继承父类私有权限的属性和方法
5). Python中没有像C++中 public 和 private, protected 这些关键字来区别公有属性和私有属性。 6). Python是以属性命名方式来区分,如果在属性和方法名前面加了2个下划线'__',则表明该属性和方法是私有权限,否则为公有权限。
修改私有属性的值
现代软件开发中,通常会定义get_xxx()方法和set_xxx()方法来获取和修改私有属性值 get_xxx()方法-->返回私有属性的值 set_xxx()方法-->接收参数,修改私有属性的值 对象不能访问私有权限的属性和方法,可以通过访问公有方法set_money()来修改私有属性的值,可以通过访问公有方法get_money()来获取私有属性的值
类属性和实例属性
类属性和实例属性 在了解了类基本的东西之后,下面看一下python中这几个概念的区别 先来谈一下类属性和实例属性 在前面的例子中我们接触到的就是实例属性(实例对象属性),顾名思义,类属性就是类对象所拥有的属性,它被所有类对象的实例对象所共有,在内存中只存在一个副本,这个和C++中类的静态成员变量有点类似。对于公有的类属性,可以通过类或者实例对象访问 实例属性只能通过对象来调用,类不能调用
类属性
实例属性(对象属性)
通过实例(对象)去修改类属性
对象修改类属性,只对本对象有效果,对别的 对象没有影响
静态方法和类方法
类方法 是类对象所拥有的方法,需要用修饰器@classmethod来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以cls作为第一个参数(当然可以用其他名称的变量作为其第一个参数,但是大部分人都习惯以‘cls’作为第一个参数的名字,就最好用‘cls’了),能够通过实例对象和类名去访问。
静态方法和类方法
2. 静态方法
需要通过修饰器@staticmethod来进行修饰,静态方法不需要多定义参数,可以通过对象和类来访问。
静态方法中不需要额外定义参数,调用静态方法可以通过对象或者类调用
实例方法
总结: 类方法使用@classmethod装饰,第一个参数为类(cls),调用时可以通过类的实例或者类本身来调用。 静态方法使用@staticmethod装饰,调用时可以使用类的实例或者类本身来调用。 实例方法定义时第一个参数为类的一个实例(self),调用时必须通过实例调用。