目录
二十七、类与对象
类的创建
clss Student:
pass
#类名由一个或者多个单词组成,每个单词的首字母大写,其余小写(规范)
类的组成
类属性
实例方法
静态方法
类方法
对象
对象的创建又称为类的实例化
语法:
实例名=类名()
类属性、类方法和静态方法的使用方式
动态绑定属性和方法
面向对象的三大特征
封装:提高程序的安全性
继承:提高代码的复用性
多态:提高程序的可扩展性和可维护性
封装
在Python中没有专门的修饰符用于属性的私有。如果该属性不希望在类对象外部被访问,前面使用两个“_"。
但是我们还是可以通过_类名__属性进行访问
继承
同时子类也可以有多个父类
方法重写
如果子类对继承自父类的某个属性或方法不满意,可以在子类中对其(方法体)进行重新编写
子类重写后的方法可以通过super().xxx()调用父类中的被去重写的方法
多态
即使不知道一个变量所引用的对象到底是什么类型,仍然可以通过这个变量调用方法,在运行过程中根据变量所引用对象的类型,动态决定调用哪个对象中的方法
动态语言和静态语言关于多态的区别
(如java)静态语言实现多态的三个必要条件
-
继承
-
方法重写
-
父类引用指向子类对象
而多态不一定要父类引用指向子类,只要有这个方法就能使用
object类
object类是所有类的父类,因此所有类都有object类的属性和方法
内置函数dir()可以查看指定对象所有属性
Object有一个_str_()方法,用于返回一个对于“对象的描述”,对应于内置函数str()经常用于print()方法,帮我们查看对象的信息,所以我们经常会对_str_()进行重写
特殊属性和特殊方法
特殊属性
_dict_ 获得类对象或实例对象所绑定的所有属性和方法的字典
特殊方法
_len_() 通过重写_len_()方法,让内置函数len()的参数可以是自定义类型
_add_() 通过重写_add_()方法,可使用自定义对象具有“+”功能
_new_() 用于创建对象
_init_() 对创建的对象进行初始化
_len_()和_add_()
_new_()和_init_()
具体原理可以通过调试过程来查看
先是调用了new方法进行创建对象obj
创建完后返回obj对self进行赋值
执行完后初始化方法后又把self给了p1,所以我们会发现最后三个的id 都是一样的
类的赋值以及浅拷贝和深拷贝
类的赋值
只是形成两个变量,实际上还是指向同一个对象
浅拷贝
Python拷贝一般都是浅拷贝,拷贝只拷贝源对象,对象包含的子对象内容不拷贝,因此,源对象与拷贝对象会引用同一个子对象
会发现源对象的内存地址不一样,但是子对象cpu和disk的内存地址一样
深拷贝
使用copy模块的deepcopy函数,递归拷贝函数中包含的子对象,源对象和拷贝对象所有的子对象也不相同
会发现源对象和子对象的内存地址都不一样了