1.方法的动态性
2.私有属性和私有方法
关于私有属性和私有方法,有如下要点:
(1)通常我们约定,两个下划线开头的属性是私有的(private)。其他为公共的(public)。
(2)类内部可以访问私有属性(方法)
(3)类外部不能直接访问私有属性(方法)
(4)类外部可以通过“_类名__私有属性(方法)名”访问私有属性(方法)
输出:孙小喵
我的公司是: 百战程序员
孙小喵 的年龄是: 23
磨刀不误砍柴工,读完硕士再打工!
23
3.@property装饰器
@property可以将一个方法的调用方式变成“属性调用”。
输出:30000
<class 'int'>
输出:月薪为10000,年薪为120000
10000
薪水录入错误!只能在0-50000之间
4.继承
Python支持多重继承,一个子类可以继承多个父类。继承的语法格式如下:
class 子类类名(父类1[,父类2,...]):
类体
如果在类定义中没有指定父类,则默认父类是object类。也就是说,object是所有类的父类,里面定义了一些所有类共有的默认实现,比如:__new__()。定义子类时,必须在其构造函数中调用父类的构造函数。调用格式如下:父类名.__init__(self,参数列表)
输出:孙小喵 的年龄是: 23
5.类成员的继承和重写
(1)成员继承:子类继承了父类除构造方法之外的所有成员。
(2)方法重写:子类可以重新定义父类中的方法,这样就会覆盖父类的方法,也称为“重写”。
输出:孙小喵 的分数是: 100
报告老师,我是 孙小喵
孙小喵 的年龄是: 23
6.查看类的继承层次结构
通过类的方法mro()或者类的属性__mro__可以输出这个类的继承层次结构。
7.object根类
object类是所有类的父类,因此所有的类都有object类的属性和方法。
8.内置函数dir(),他可以让我们方便的看到指定对象所有的属性。
【测试】查看对象所有属性以及和object进行比对
输出:['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'age', 'name', 'say_age']
从上面我们可以发现这样几个要点:
(1)Person对象增加了六个属性:__dict____module____weakref__agenamesay_age
(2)object的所有属性,Person类作为object的子类,显然包含了所有的属性。
(3)我们打印age、name、say_age,发现say_age虽然是方法,实际上也是属性。只不过,这个属性的类型是“method”而已。
age<class'int'>
name<class'str'>
say_age<class'method'>
9.object有一个__str__()方法,用于返回一个对于“对象的描述”,对应于内置函数str()经常用于print()方法,帮助我们查看对象的信息。__str__()可以重写。
输出:名字是:孙小喵,年龄是23
10.Python支持多继承,如果父类中有相同名字的方法,在子类没有指定父类名时,解释器将“从左向右”按顺序搜索。MRO(MethodResolutionOrder):方法解析顺序。我们可以通过mro()方法获得“类的层次结构”,方法解析顺序也是按照这个“类的层次结构”寻找的。
11.在子类中,如果想要获得父类的方法时,我们可以通过super()来做。super()代表父类的定义,不是父类对象。
12.关于多态要注意以下2点:(1)多态是方法的多态,属性没有多态。(2)多态的存在有2个必要条件:继承、方法重写。
输出:小狗,汪汪汪
小猫,喵喵喵
13.特殊方法和运算符重载
操作:“运算符的重载”
输出:孙小喵--孙喵喵
孙小喵孙小喵孙小喵14.
14.特殊属性
15.对象的浅拷贝和深拷贝
变量的赋值操作只是形成两个变量,实际还是指向同一个对象。
·浅拷贝:Python拷贝一般都是浅拷贝。拷贝时,对象包含的子对象内容不拷贝。因此,源对象和拷贝对象会引用同一个子对象。
·深拷贝:使用copy模块的deepcopy函数,递归拷贝对象中包含的子对象。源对象和拷贝对象所有的子对象也不同。
输出:计算,算个12345
CPU对象: <__main__.CPU object at 0x000001905029AAC8>
<__main__.MobilePhone object at 0x00000190502EB108> <__main__.MobilePhone object at 0x00000190502EB108>
<__main__.MobilePhone object at 0x00000190502EB108> <__main__.MobilePhone object at 0x00000190502EB188>
计算,算个12345
CPU对象: <__main__.CPU object at 0x000001905029AAC8>
计算,算个12345
CPU对象: <__main__.CPU object at 0x000001905029AAC8>
计算,算个12345
CPU对象: <__main__.CPU object at 0x00000190502EB208>
16.组合
“is-a”关系,我们可以使用“继承”。从而实现子类拥有的父类的方法和属性。“is-a”关系指的是类似这样的关系:狗是动物,dog is animal。狗类就应该继承动物类。
“has-a”关系,我们可以使用“组合”,也能实现一个类拥有另一个类的方法和属性。”has-a”关系指的是这样的关系:手机拥有CPU。MobilePhone has a CPU。
输出:计算,算个12345
显示一个好看的画面
17.设计模式_工厂模式实现
初学者,我们学习两个最常用的模式:工厂模式和单例模式。
工厂模式实现了创建者和调用者的分离,使用专门的工厂类将选择实现类、创建对象进行统一的管理和控制。
输出:<__main__.Benz object at 0x000001FAAFAB3F48>
<__main__.BMW object at 0x000001FAAFAB3948>
18.设计模式_单例模式实现
单例模式(SingletonPattern)的核心作用是确保一个类只有一个实例,并且提供一个访问该实例的全局访问点。单例模式只生成一个实例对象,减少了对系统资源的开销。当一个对象的产生需要比较多的资源,如读取配置文件、产生其他依赖对象时,可以产生一个“单例对象”,然后永久驻留内存中,从而极大的降低开销。单例模式有多种实现的方式,我们这里推荐重写__new__()的方法。
输出:init....
<__main__.MySingleton object at 0x00000299F1E16448>
<__main__.MySingleton object at 0x00000299F1E16448>