目录
二十七、类与对象
类的创建
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函数,递归拷贝函数中包含的子对象,源对象和拷贝对象所有的子对象也不相同

会发现源对象和子对象的内存地址都不一样了











