虽然 Python 是解释性语言,但是它是面向对象的,能够进行对象编程。
__init__()
方法
__init__()
方法,在创建一个对象时默认被调用,不需要手动调用__init__(self)
中,默认有 1 个参数名字为 self,如果在创建对象时传递了2个实参,那么__init__(self)
中出了self 作为第一个形参外还需要 2 个形参,例如__init__(self,x,y)
__init__(self)
中的 self 参数,不需要开发者传递,python 解释器会自动把当前的对象引用传递进去- 所谓的self,可以理解为自己。可以把 self 当做 Java 中类里面的 this 指针一样理解,就是对象自身的意思
1 | # 定义类 |
总结:
- 在 python 中方法名如果是
__xxxx__()
的,那么就有特殊的功能,因此叫做“魔法”方法 - 当使用 print 输出对象的时候,只要自己定义了
__str__(self)
方法,那么就会打印从在这个方法中return
的数据
私有属性
Python 中没有像 Java 中 public 和 private 这样的关键字来区别公有属性和私有属性。它是以属性命名方式来区分,如果在属性名前面加了 2 个下划线 __
,则表明该属性是私有属性,否则为公有属性(方法也是一样,方法名前面加了 2 个下划线的话表示该方法是私有的,否则为公有的)。
1 | # coding=utf-8 |
继承
- 子类在继承的时候,在定义类时,小括号
()
中为父类的名字 - 父类的属性、方法,会被继承给子类
- 私有的属性、方法,不会被子类继承,也不能被访问
- 一般情况下,私有的属性、方法都是不对外公布的,往往用来做内部的事情,起到安全的作用
- python 中是可以多继承的,若两个父类中有名字相同的方法,会调用前面一个的。使用
类.__mro__
可以查看调用顺序。
1 | # coding=utf-8 |
重写父类方法
所谓重写,就是子类中,有一个和父类相同名字的方法,在子类中的方法会覆盖掉父类中同名的方法。
这时若要调用在子类中父类的方法,需要使用 super()
。
1 | #coding=utf-8 |
多态
定义时的类型和运行时的类型不一样,此时就成为多态。
1 | # coding=utf-8 |
类属性和实例属性
类属性就是类对象所拥有的属性,它被所有类对象的实例对象所共有,在内存中只存在一个副本,这个和 Java 中类的静态成员变量有点类似。对于公有的类属性,在类外可以通过类对象和实例对象访问。
如果需要在类外修改类属性,必须通过类对象去引用然后进行修改。如果通过实例对象去引用,会产生一个同名的实例属性,这种方式修改的是实例属性,不会影响到类属性,并且之后如果通过实例对象去引用该名称的属性,实例属性会强制屏蔽掉类属性,即引用的是实例属性,除非删除了该实例属性。
1 | # coding=utf-8 |
类方法和静态方法
类对象所拥有的方法,需要用修饰器 @classmethod
来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以 cls
作为第一个参数(当然可以用其他名称的变量作为其第一个参数,但是大部分人都习惯以 cls 作为第一个参数的名字),能够通过实例对象和类对象去访问。
需要通过修饰器 @staticmethod
来进行修饰,静态方法不需要多定义参数
从类方法和实例方法以及静态方法的定义形式就可以看出来,类方法的第一个参数是类对象 cls,那么通过 cls 引用的必定是类对象的属性和方法;
而实例方法的第一个参数是实例对象 self,那么通过 self 引用的可能是类属性、也有可能是实例属性(这个需要具体分析),不过在存在相同名称的类属性和实例属性的情况下,实例属性优先级更高。
静态方法中不需要额外定义参数,因此在静态方法中引用类属性的话,必须通过类对象来引用。
1 | # coding=utf-8 |
__new__ 方法
__new__
至少要有一个参数 cls,代表要实例化的类,此参数在实例化时由 Python 解释器自动提供__new__
必须要有返回值,返回实例化出来的实例,这点在自己实现__new__
时要特别注意,可以 return 父类__new__
出来的实例,或者直接是 object 的__new__
出来的实例__init__
有一个参数 self,就是这个__new__
返回的实例,__init__
在__new__
的基础上可以完成一些其它初始化的动作,__init__
不需要返回值我们可以将类比作制造商,
__new__
方法就是前期的原材料购买环节,__init__
方法就是在有原材料的基础上,加工,初始化商品环节
1 | class A(object): |
单例模式
举个常见的单例模式例子,我们日常使用的电脑上都有一个回收站,在整个操作系统中,回收站只能有一个实例,整个系统都使用这个唯一的实例,而且回收站自行提供自己的实例。因此回收站是单例模式的应用。
确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,单例模式是一种对象创建型模式。
1 | # coding=utf-8 |