面向对象(类和实例、数据封装、访问限制、继承和多态)

1.类和实例

类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同。

面向对象(类和实例、数据封装、访问限制、继承和多态)面向对象(类和实例、数据封装、访问限制、继承和多态)内存地址

  • 给实例绑定属性
    面向对象(类和实例、数据封装、访问限制、继承和多态)面向对象(类和实例、数据封装、访问限制、继承和多态)
  • 由于类可以起到模板的作用,因此,可以在创建实例的时候,把一些我们认为必须绑定的属性强制填写进去
    面向对象(类和实例、数据封装、访问限制、继承和多态)面向对象(类和实例、数据封装、访问限制、继承和多态)

2.数据封装

就是在类里面定义方法,来访问类里面的数据

面向对象(类和实例、数据封装、访问限制、继承和多态)面向对象(类和实例、数据封装、访问限制、继承和多态)

从外部看Student类,就只需要知道,创建实例需要给出namescore,而如何打印,都是在Student类的内部定义的,这些数据和逻辑被“封装”起来了,调用很容易,但却不用知道内部实现的细节。

3.访问限制

属性名称前面加上“_ _”两个下划线,就变成了私有变量只有内部可以访问。

【双下划线开头,并且以双下划线结尾的“__xx__”,是特殊变量,特殊变量是可以直接访问的,不是private变量】

如修改上面的Student类

面向对象(类和实例、数据封装、访问限制、继承和多态)面向对象(类和实例、数据封装、访问限制、继承和多态)

这样就访问不到了,限制了访问。如果想要获取 可以在类中再次定义如get_score()方法,用来获取。【其他需求同理】

面向对象(类和实例、数据封装、访问限制、继承和多态)面向对象(类和实例、数据封装、访问限制、继承和多态)

请把下面的Student对象的gender字段对外隐藏起来,用get_gender()set_gender()代替,并检查参数有效性:

面向对象(类和实例、数据封装、访问限制、继承和多态)面向对象(类和实例、数据封装、访问限制、继承和多态)

4.继承和多态

  • 继承就是class Student(object): 因为Student 没有继承什么,所以写object 所有的类都继承object。

面向对象(类和实例、数据封装、访问限制、继承和多态)面向对象(类和实例、数据封装、访问限制、继承和多态)

  • 可以在子类中对父类中的方法进行改进(当存在和父类相同的方法的时候,运行时子类的方法会覆盖父类的方法)
    面向对象(类和实例、数据封装、访问限制、继承和多态)面向对象(类和实例、数据封装、访问限制、继承和多态)
  • 多态就是比如Student 继承了People 可以看到 A既是Student类型又是People类型。【反过来就不行】
    面向对象(类和实例、数据封装、访问限制、继承和多态)面向对象(类和实例、数据封装、访问限制、继承和多态)

多态的好处:

面向对象(类和实例、数据封装、访问限制、继承和多态)

新增一个People的子类,不必对another()做任何修改,实际上,任何依赖People作为参数的函数或者方法都可以不加修改地正常运行,原因就在于多态。

开闭原则:

对扩展开放:允许新增People子类;

对修改封闭:不需要修改依赖People类型的another()等函数